拓扑排序
拓扑排序的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 }

浙公网安备 33010602011771号