【问题标题】:transitive relation in an adjacency matrix邻接矩阵中的传递关系
【发布时间】:2012-12-05 04:52:42
【问题描述】:

我正在尝试确定两个元素之间的传递关系。我正在用 c 编码。

例如:a->b 在第一行第二列的邻接矩阵中用“1”表示。

所以如果 a->b 和 b-> c 和 c->d

我想确定是否 a->d。无需更新邻接矩阵。

我采用的方法:检查与 a 对应的行中的所有 1。假设第二列中有一个 1,即 b。 [(a->b)] ,现在检查是否 b->d 如果不继续检查 B 行中的所有 1 并继续到第 26 行。

我并不真正关心复杂性。我只是希望实现这一点。

【问题讨论】:

  • 您是否要检查整个图是否可传递?还是您只关心图中的 3 个特定给定元素?当你说“要识别 a->d”时,你的意思是要查看图形中是否存在 a->d?
  • 我只想对元素进行传递检查。所以如果 a->b b-> 我有兴趣知道 a->c。
  • 你写了“b->”,但我猜你的意思是“b->c”,对吗?你也是说如果图形包含其他元素d,以及a->b和b->d,你不在乎是否a->d?
  • 换句话说:我看到您可能会问两个可能的问题,但我不确定是哪一个。可能性#1:问题的输入是一个图,输出应该是一个布尔值,指示图是否是可传递的。可能性 #2:输入是一个图加上该图中 3 个特定顶点的列表(我们将其称为 a、b 和 c),输出应该是一个布尔值,指示这 3 个顶点是否可传递。它是哪一个?还是别的什么?
  • 嗨@j_random_hacker,我的问题很简单。在邻接矩阵中,如果我在第 0 行第 1 列中有 1,则表示 A -> B。类似地,如果 b->c;但我想检测到 a->c.

标签: c algorithm computation-theory adjacency-matrix


【解决方案1】:

您需要实现breadth-first searchdepth-first search。从a 开始,到达d 或用尽所有选项时停止。

在您的情况下,深度优先搜索更容易实现,因为“普通”C 缺少广度优先搜索所需的内置动态队列。

如果你不关心效率,不介意更新矩阵,实现Floyd-Warshall algorithm:它是专门为邻接矩阵制定的,只需五行即可实现:

for (int k = 0 ; k != N ; k++)
    for (int i = 0 ; i != N ; i++)
        for (int j = 0 ; j != N ; j++)
            if (matrix[i][k] && matrix[k][j])
                matrix[i][j] = 1;

运行此算法后,生成的matrix 包含原始闭包的传递闭包。

【讨论】:

  • 要实现 DFS,我必须创建一个节点并遍历。我希望找到某种标准方法来单独在邻接矩阵中进行传递性检查。
  • @KiranBangalore 你绝对不需要创建节点。 BFS 和 DFS 的美妙之处在于它们是抽象的,以至于你的图的表示根本不重要。给定一行,DFS 将遍历每一列以搜索 1,然后递归向下。当然,如果性能对您不重要,您可以使用 Floyd-Warshall。
  • 嗨,我明白你现在的意思了。 DFS 似乎是前进的正确方式。否则我可以使用 Floyd-Warshall 算法并在每次需要检查时调用它。
  • @KiranBangalore 你在第一部分是对的,但不是第二部分:如果你使用 Floyd Warshall,你只需要调用一次,因为它一次完成了整个图表。运行一次后,您将获得整个图的传递闭包的矩阵,因此您需要做的就是查找matrix[i][j]
  • 我认为 OP 想要 test 的传递性,所以最好用 if (!matrix[i][j]) return false; return true; 替换代码的底线。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 2013-11-30
  • 1970-01-01
相关资源
最近更新 更多