拓扑排序的
DFS
算法
输入:一个有向图
输出:顶点的拓扑序列
具体流程:
(1) 调用DFS算法计算每一个顶点v的遍历完成时间f[v]
(2) 当一个顶点完成遍历时,将该顶点放到一个链表的最前面
(3) 返回链表(按照链表次序输出顶点即为顶点的拓扑序列)
样例输入
5 5 0 1 1 0 2 1 1 2 1 2 3 1 4 2 1
样例输出
4 0 1 2 3
因为对有向无环图进行dfs遍历,得到的可能是森林,所以为了保证对所有点进行拓扑排序,我的做法是对所有入度为0的点进行dfs遍历
1 #include <iostream> 2 #include <deque> 3 using namespace std; 4 5 int ** edges; 6 int * visited; 7 int * in_degrees; 8 9 int v,e; 10 deque<int> dq; 11 void dfs(int i){ 12 visited[i] = 1; 13 for(int j=0;j<v;j++){ 14 if(!visited[j] && edges[i][j] != 0){ 15 dfs(j); 16 } 17 } 18 dq.push_front(i); 19 } 20 21 22 int main(void){ 23 cin>>v>>e; 24 //init 25 edges = new int*[v]; 26 visited = new int[v]; 27 in_degrees = new int[v]; 28 memset(visited,0,v*sizeof(int)); 29 memset(in_degrees,0,v*sizeof(int)); 30 31 int i; 32 for(i=0;i<v;i++){ 33 edges[i] = new int[v]; 34 memset(edges[i],0,v*sizeof(int)); 35 } 36 37 38 //input 39 for(i=0;i<e;i++){ 40 int a,b,w; 41 cin>>a>>b>>w; 42 edges[a][b] = w; //从a到b有一条路 43 in_degrees[b]++; //b的入度加1 44 } 45 46 for(i=0;i<v;i++){ 47 if(0==in_degrees[i]){//从入度为0的点进行dfs遍历 48 dfs(i); 49 } 50 } 51 while(!dq.empty()){ 52 printf("%d ",dq.front()); 53 dq.pop_front(); 54 } 55 //huishou 56 for(i=0;i<v;i++){ 57 delete edges[i]; 58 } 59 delete edges; 60 return 0; 61 }