在无向图中计算度数 - 逻辑问题

Posted

技术标签:

【中文标题】在无向图中计算度数 - 逻辑问题【英文标题】:Count degree in an undirected graph - logic issue 【发布时间】:2013-06-15 14:33:38 【问题描述】:

我有关联矩阵,并基于它计算图中每个顶点的度数。

假设这是当前的关联矩阵:

-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 指令以减少重复的反转列?

【问题讨论】:

顺便说一句。我必须创建新帐户才能发布此内容...每天 6 个帖子限制真是太搞笑了。 如果您每天需要在 SO 上发布超过 6 个问题,那么您 probably need to reconsider.... 您不应该为无向图复制边。就像现在一样,你得到了正确的答案——你有两条边进出这些顶点。此外,paint 具有圆形、线条和类型工具,它使您的插图更具吸引力。 嗯,这很难回答,因为你可以应用很多策略:1)不重复 2)删除重复 3)按顶点排序,所以 2 列无向图将始终相邻.. . 如何删除重复项?那么我将无法创建一个关联矩阵......如果我不复制边缘,1 和 -1 会去哪里? 【参考方案1】:

你所谓的incidence matrix 真的不是。这是一个边缘列表。边列表存在您所看到的问题:重复、每个无向边的双重表示等。它们几乎从来都不是图数据结构的最佳选择。

在关联矩阵中,行和列都是顶点。第 i 行第 i 列中的 1(或标签值,如果边缘被标记)表示从 i 到 j 有一条边。零(或其他表示“无”的值)表示没有边缘。

如果图是无向的,那么矩阵是对称的:从 i 到 j 的边总是有从 j 到 i 的匹配。因此,您可以擦除矩阵的上三角或下三角而不会丢失信息。

一旦顶点被编号,关联矩阵是唯一的。不能发生重复。如果边缘未标记,则可以将其存储在位图中。

计算有向图的度数仅意味着计算顶点列中的 1。出度是在行中计算 1。如果图形是无向的,由三角形数组表示,则相同的过程也可以正常工作。不需要除以 2。

关联矩阵的主要缺点是它需要 O(n^2) 空间来存储n 顶点的每个图,无论它有多少边。如果图是“稀疏的”,即它只有 O(n) 条边,这可能是一个问题。在这种情况下,首选的数据结构是adjacency list,我会让您自己阅读。

【讨论】:

以上是关于在无向图中计算度数 - 逻辑问题的主要内容,如果未能解决你的问题,请参考以下文章

欧拉回路混合图的欧拉回路

Havel-Hakimi定理---通过度数列判断是否可图化

无向图欧拉道路(欧拉回路)的判定与路径打印

欧拉回路的判断

洛谷 - P1989 无向图三元环计数(思维建图)

hdu 1878 欧拉回路+并查集