反向DFS的CLRS拓扑排序算法
CLRS Topological sort algorithm reverse of DFS?
我对拓扑排序的步骤有一个困惑,我看到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?
是的,它总是正确的。DFS在DAG上的反转给出了拓扑排序。
来源:http://www.cse.ust.hk/faculty/golin/COMP271Sp03/Notes/MyL08.pdf slide 13
相关文章:
- C++选择排序算法中的逻辑错误
- 排序算法c++
- 下面是排序算法O(n)吗
- 为什么我的排序算法会更改数组值
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 排序算法问题(购买商店物品)(崩溃)
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 为什么在此排序算法实现中,向量明显比数组慢?
- C++中合并排序算法的奇怪行为
- 我的排序算法程序中的堆错误
- 如何使用cpp编写选择排序算法以降序对元素列表进行排序?
- 解释一下这个排序算法是如何工作的?
- 快速排序函数在快速排序算法中如何工作?
- 分段故障,合并排序算法
- 这种排序算法已经存在吗?
- 为什么此代码上的排序算法不调用类的交换版本?
- 为什么我的替代排序算法不起作用?
- 选择排序算法生成无序结果
- 递归合并排序算法实现
- 这种快速排序算法有什么问题?