gpt4 book ai didi

c++ - DFS的CLRS拓扑排序算法逆向?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:13 24 4
gpt4 key购买 nike

我对拓扑排序的步骤感到困惑,我看到 DFS 的逆序是拓扑排序的一种预期解决方案。

我也尝试了一个小代码

void graph::dfs(void)
{
for(std::vector<vertex>::iterator iter =vertexes.begin();iter < vertexes.end();iter++ ){
iter->visited = WHITE;
}

for(std::vector<vertex>::iterator iter =vertexes.begin();iter < vertexes.end();iter++ ){
if(iter->visited == WHITE){
dfs_visits(*iter);
}
}

std::cout << "-----------------dfs------------------"<<std::endl;
for(std::list<int>::reverse_iterator riter = q.rbegin() ; riter != q.rend();riter++)
std::cout << *riter << std::endl;

std::cout << "-----------------topological_sort------------------"<<std::endl;
for(std::list<int>::iterator iter = q.begin() ; iter != q.end();iter++)
std::cout << *iter << std::endl;


q.clear();
}


void graph::dfs_visits(vertex& source){
source.visited = GREY;
for(std::list<edge>::iterator iter = source.list.begin();iter != source.list.end();iter++){
if(vertexes[iter->destination_vertex].visited == WHITE){
dfs_visits(vertexes[iter->destination_vertex]);
}
}
source.visited = BLACK;
q.push_front(source.id);
}

图数据结构在这里

#include "iostream"
#include "vector"
#include "list"

enum color{
WHITE,
GREY,
BLACK
};

struct edge{
int destination_vertex;
edge(int ver){
destination_vertex = ver;
}
};

struct vertex{
int id;
color visited;
std::list<edge> list;
vertex(int _id){
id = _id;
}
};


class graph
{
private:
std::vector<vertex> vertexes;
int next;
std::list<int> q;
public:
graph(void){
next = 0;
}
~graph(void){}
void add_node(std::vector<int> edges );
void add_node(std::vector<int> incoming_edges , std::vector<int> outgoing_edges);
void print();
void dfs();
void dfs_visits(vertex& source);
void bfs();
static void process();
};

这是一个例子我试过的图

0->1,2,
1->3,
2->
3->
4->
5->4,
-----------------dfs------------------
3
1
2
0
4
5
-----------------topological_sort-----
5
4
0
2
1
3
更改问题陈述

我的问题真的很简单.. 拓扑排序总是倒序的DFS吗?如果不是有反例吗?

如果你看到我对特定图的输出,DFS 输出及其反向也是图拓扑排序的正确解决方案......同时阅读 CLR 拓扑排序算法它看起来也像拓扑排序是反向的DFS?

最佳答案

是的,它总是正确的。 DAG 上 DFS 的逆向给出了拓扑排序。

来源:http://www.cse.ust.hk/faculty/golin/COMP271Sp03/Notes/MyL08.pdf幻灯片 13

关于c++ - DFS的CLRS拓扑排序算法逆向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17096894/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com