输入数据:
4 6
1 2
1 3
2 3
3 4
2 4
4 2
4 6
1 2
1 3
2 3
3 4
2 4
1 2
topo排序为偏序:
1 #include<stdio.h> 2 #include<queue> 3 #include<string.h> 4 using namespace std; 5 int indegree[100] ; 6 queue<int>q; 7 int n , m ; 8 bool map[100][100] ; 9 int a[100] ; 10 int topo(int n) 11 { 12 int cnt = 0 ; 13 while (!q.empty ()) 14 q.pop () ; 15 16 for(int i = 1 ; i <= n ; i++) { 17 if (indegree[i] == 0) { 18 q.push(i);//入度为0的点为起始点 19 } 20 } 21 22 int temp ; 23 while(!q.empty()) { 24 temp = q.front(); 25 a[cnt ++] = temp ; 26 q.pop(); 27 for(int i = 1 ; i <= n ; i++) { 28 if(map[temp][i]) { 29 indegree[i]--; 30 if(indegree[i] == 0) 31 q.push(i); 32 } 33 } 34 } 35 if (cnt == n) //当输出的顶点数小于图中的顶点数时,输出有回路信息 36 for (int i = 0 ; i < n ; i++) { 37 printf ("%d----->" , a[i]) ; 38 } 39 else 40 puts ("The network has a cycle!") ; 41 } 42 43 int main () 44 { 45 // freopen ("a.txt" , "r" , stdin) ; 46 int u , v ; 47 while (~ scanf ("%d%d" , &n , &m)) { 48 memset (indegree , 0 , sizeof(indegree)) ; 49 memset (map , 0 , sizeof(map)) ; 50 for (int i = 0 ; i < m ; i++) { 51 scanf ("%d%d" , &u , &v) ; 52 if (!map[u][v])//在u 和 v 没有连通时 53 indegree[v]++ ;//点v的入度++ 54 map[u][v] = 1 ;//表示连通 55 } 56 topo (n) ; 57 } 58 }
演示:http://www.tyut.edu.cn/kecheng1/site01/suanfayanshi/topological_sort.asp
详细:http://blog.csdn.net/dm_vincent/article/details/7714519
1 -----------------hash table------------------------------------ 2 struct Hash 3 { 4 int nxt ; 5 ll w ; 6 Hash () {} 7 Hash (int nxt , ll w) : nxt (nxt) , w (w) {} 8 }e[M]; 9 int H[M] , E ; 10 11 void init () 12 { 13 E = 0 ; 14 memset (H , 0 , sizeof(H) ) ; 15 } 16 17 void Insert (ll x) 18 { 19 int y = x % M ; 20 if (y < 0) y += M ; 21 e[E ++] = (H[y] , x) ; 22 H[y] = E ; 23 } 24 25 bool Find (ll x) 26 { 27 int y = x % M ; 28 if (y < 0) y += M ; 29 for (int i = H[y] ; i ; i = e[i].nxt) { 30 if (e[i].w == x) return true ; 31 } 32 return false ; 33 } 34 ------------------邻接表-------------------------------------------------------- 35 struct edge 36 { 37 int u , v , w , nxt ; 38 edge () {} 39 edge (int u , int v , int w , int nxt) : u (u) , v (v) , w (w) , nxt (nxt) {} 40 }e[M]; 41 int H[M] , E ; 42 void init () 43 { 44 memset (H , 0 , sizeof(H) ) ; 45 E = 0 ; 46 } 47 48 void addedge () 49 { 50 e[E ] = edge (u , v , w , H[u]) ; 51 H[u] = E ++; 52 e[E ] = edge (v , u , w , H[v]) ; 53 H[v] = E ++; 54 }
用邻接表优化后的。时间,空间复杂度都降为O(N)