基于DFS的拓扑排序

上一篇介绍了基于入度的拓扑排序方法(上一篇链接点击打开链接)

下面介绍基于DFS的拓扑排序方法,核心思想是当当前的点被加入栈之前,要保证它的所有邻接顶点都已经加入到栈中了,这样栈中有顶自下的顺序就是入度从小到大的顺序。

图片如下:


图1:DAG

(图片来源于geeksforgeeks,代码参考geeksforgeeks)

废话不多说,直接上代码:

//基于 DFS的拓扑排序
#include
#include
#include
using namespace std;

class Graph{
private:
    int V;          //顶点数量
    list *adj; //邻接链表
    //采用DFS的思想,根据递归过程,很容易看出入度为0的点是最后被加入到栈中的。
    //因为只有该点的所有邻接点都加入到栈之后,这个点才会被加入到栈 
    bool toplogicalSortUtil(int v, bool visit[], stack& s){
        visit[v] = true;
        list::iterator itr;
        //对该点的所有邻接点进行拓扑排序 
           for(itr = adj[v].begin(); itr != adj[v].end(); itr++){
               if(!visit[*itr]){
                toplogicalSortUtil(*itr,visit,s);
            }
        }
        //只有当邻接点都被加入到栈后,这个点才会被加入到栈  
        s.push(v);
    }
    
public:
    Graph(int V){
        this->V = V;
        adj = new list[V];
        
    }
    
    //有向图
    void addEdge(int src, int dest){
        adj[src].push_back(dest);
    } 
    
    void toplogicalSortDFS(){
        bool *visit = new bool[V];
        stack s;
        //对每个点遍历,进行拓扑排序。 
        for(int v = 0; v < V; v++){
            if(!visit[v])
                toplogicalSortUtil(v,visit,s);
        }
        while(!s.empty()){
            cout << s.top() << " ";
            s.pop();
        }
        cout << endl;
    }
    
    
     
};

int main()
{
    
    Graph g(6);
    g.addEdge(5, 0);
    g.addEdge(5, 2);
    g.addEdge(4, 0);
    g.addEdge(4, 1);
    g.addEdge(2, 3);
    g.addEdge(3, 1);
 
    cout << "拓扑排序的一种结果是 \n";
    g.toplogicalSortDFS();
 
    return 0;
}
 





你可能感兴趣的:(基于DFS的拓扑排序)