我有一个任务要写一些代码,从一个图中获取一个节点列表,并确定它们是否在正确的拓扑顺序中。
图形在内存中表示如下:

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
另外,有没有比上面的算法更好的算法来执行这个任务?

最佳答案

引用CLR:
dag g g=(v,e)的拓扑排序是其所有顶点的线性排序,因此如果g包含边(u,v),则u在排序中出现在v之前。
这就是您实际在最内层for循环中检查的内容如果m可以从n到达,但它已经在v中,则表示您在访问n之前已经访问过m,因此l不是拓扑排序的。
回答下一个问题,就可以实现
对于从n do可到达的每个节点m
使用DFS或BFS所以,在节点n上,需要检查是否存在从n到m的有向边。

关于c - 验证图的给定节点列表是正确的拓扑顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36381100/

10-13 01:13