首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CLRS拓扑排序算法DFS的逆向?

CLRS拓扑排序算法DFS的逆向?
EN

Stack Overflow用户
提问于 2013-06-14 04:53:34
回答 1查看 3.5K关注 0票数 3

在拓扑排序的步骤中,我有一个困惑,我看到DFS的逆序是拓扑排序的预期解决方案。

我还尝试了一个小代码

代码语言:javascript
复制
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);
}

图数据结构如下所示

代码语言:javascript
复制
#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();
};

下面是我试过的一张图

代码语言:javascript
复制
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的输出和它的反转是对图的拓扑排序的正确解决方案,too....also读到了CLR拓扑排序算法,它看起来拓扑排序是DFS的反转?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-14 05:17:33

是的,这总是正确的。与DAG上的DFS相反的是拓扑排序。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17096894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档