拓撲排序 DFS實現


 

拓撲排序,必須是有向無環圖。

在任一有向無環圖中,必然存在出度為0的頂點。否則,每個頂點都至少有一條出邊,這意味着包含環路。

在對有向無環圖的DFS搜索中,首先因訪問完成而轉換至VISITED狀態的頂點m,其出度必然為0。

基於上述兩條特性,我們可以得出結論:

DFS搜索過程中各頂點被標記為VISITED的次序,恰好(按逆序)給出了原圖的一個拓撲排序。

代碼:

#include <iostream>
#include <string>
#include <cstdlib>
#include <sstream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <map>
#include <math.h>
#include <stack>
using namespace std;

stack<int> s; ///用來保存逆序
int graph[100][100]; ///鄰接矩陣存儲,節點從0開始

int visited[100];
int n; ///節點個數
int e; ///用來存邊的條數

void dfs(int v){
    visited[v] = 1;
    for(int i=0;i<n;i++){
        if(graph[v][i]==1&&visited[i]==0){
            dfs(i);
            if(visited[i]==1)
                s.push(i);
        }
    }
}

void solve(){
    ///初始化
    scanf("%d",&n);
    scanf("%d",&e);
    for(int i=0;i<e;i++){
        int v1,v2;
        scanf("%d%d",&v1,&v2);
        graph[v1][v2]=1;
    }
    ///dfs過程
    for(int i=0;i<n;i++){
        if(visited[i]==0){
            dfs(i);
            if(visited[i]==1)
                s.push(i);
        }
    }

    ///輸出入
    while(!s.empty()){
        printf("%d ",s.top());
        s.pop();
    }
}

int main() {
    solve();
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM