【问题标题】:Verify that given list of nodes of a graph is a correct topological order验证图的给定节点列表是否是正确的拓扑顺序
【发布时间】:2016-07-22 17:20:18
【问题描述】:

我的任务是编写一些代码,从图表中获取节点列表,并确定它们是否处于正确的拓扑顺序。

图形在内存中表示如下:

typedef struct graph_t* Graph;
typedef struct node_t* Node;

struct node_t {
    int id;
    /*incoming edges*/
    Linked_list incoming;
    /*outgoing edges*/
    Linked_list outgoing;
};

struct graph_t {
    int order;
    int size;
    Node nodes;
};

为了简洁,我省略了链表的实现,但这只是链表的标准实现。

我还得到了以下算法(伪代码):

L <- topologically sorted list of nodes
V <- empty list of visited nodes
for each node n in L do
    add n to V
    for each node m reachable from n do
        if m in V then L is not sorted

我确实了解拓扑顺序的定义,但我不明白这将如何或为什么会验证拓扑排序。

这个算法如何正确?另外,鉴于上述图表的表示,for each node m reachable from n do 线将如何实现?

另外,是否有比上述算法更好的算法来执行此任务?

【问题讨论】:

  • 这不是调试或咨询服务。见How to Ask
  • @Olaf 我不是在问如何实现该算法,只是为了解释它为什么起作用。这违反了提问的规则吗?如果是这样,我将删除我的帖子
  • 请再次阅读我的评论。我没有说你要求实施。

标签: c algorithm graph topological-sort


【解决方案1】:

这个想法基本上是基于以下事实:

令 L 是图 G 的一个有序顶点序列。那么 L 是一个 图 G 的拓扑顺序当且仅当 G 中的所有边都指向 L 向右。换句话说,对于每个有向边 (L[i], L[j]) 我们有 i

在您提供的方法中,您正在进行上述检查。你检查L中是否有一条指向左边的边,从上面的事实我们知道在这种情况下L不是拓扑顺序。

【讨论】:

    【解决方案2】:

    引用 CLRS:

    dag G = (V,E) 的拓扑排序是其所有顶点的线性排序,如果 G 包含边 (u,v),则 u 在排序中出现在 v 之前。

    这是您在最里面的 for 循环中实际检查的内容。如果 m 可以从 n 到达,但它已经在 V 中,那么这意味着你在访问 n 之前已经访问过 m。因此 L 不是拓扑排序的。

    回答你的下一个问题,你可以实现这一行

    对于从 n 可达的每个节点 m

    使用 DFS 或 BFS。因此,在节点 n 上,您需要检查是否存在从 n 到 m 的有向边。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多