拓扑排序,必须是有向无环图。
在任一有向无环图中,必然存在出度为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; }