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