拓撲排序,必須是有向無環圖。
在任一有向無環圖中,必然存在出度為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; }