我有关联矩阵,并且基于它我在计算图中每个顶点的度数。
让我们假设这是当前的关联矩阵:
-1 -1 1 0 1 0
1 0 -1 -1 0 1
0 1 0 1 -1 -1
行是顶点,列是边。 -1表示边缘从顶点出来,它进入的是+1。
如果这是无向图,则矩阵包含某些特定模式,如下所示:
-1 0 1 0 0 0
1 0 -1 0 0 0
0 0 0 0 0 0
两行 - 相同的顶点。两条边,指向不同。这是:
的表示
但这样做了:
在有向图中计算顶点的程度(与它连接的任何边)我只是在每一行中计算-1和+1。这很有用。
问题是 - 度数在无向图中的任意位置乘以2,因为矩阵自然地将线边缘“转换”为两个箭头边缘,就像在图片上一样。
问题是 - 如果边缘是随机放置的话,如何使用关联矩阵减少度数以使其计算一条线边缘而不是两条箭头边缘?
为了清楚起来,这个算法对我想要的东西不能正常工作:
for(int i = 0; i < cols; i++)
{
int deg = 0;
for(int j = 0; j < rows; j++)
{
if(matrix[i][j] != 0) deg++;
}
std::cout << "Degree of " << i + 1 << " vertex is " << deg;
}
如何更改if指令以减少重复的反向列?
答案 0 :(得分:1)
你称之为incidence matrix的确不是。这是一个边缘清单。边缘列表存在您遇到的问题:重复,每个无向边的双重表示等。它们几乎不是图形数据结构的最佳选择。
在关联矩阵中,行和列都是顶点。在行i,列i中的1(或标记边缘的标签值)意味着从i到j存在边缘。零(或其他值表示“无”)表示没有边缘。
如果图是无向的,则矩阵是对称的:从i到j的边始终具有从j到i的匹配。因此,您可以擦除矩阵的上三角或下三角而不会丢失信息。
顶点编号后,关联矩阵是唯一的。重复不可能发生。如果边缘未标记,则可以将其存储在位图中。
以度为单位计算有向图只意味着计算顶点列中的1。 Out-degree在行中计算1。如果图形是无向的,由三角形数组表示,则相同的过程可以正常工作。不需要除以2。
关联矩阵的主要缺点是它需要O(n ^ 2)个空间来存储n
个顶点的每个图形,无论它有多少个边缘。如果图形是“稀疏的”,即它只有O(n)个边缘,这可能是一个问题。在这种情况下,首选数据结构是adjacency list,我将让您自己阅读。