topo排序 + 用邻接表优化后的

输入数据:

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 }
View Code

演示: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 }
View Code

 

用邻接表优化后的。时间,空间复杂度都降为O(N)

posted @ 2015-03-04 21:07  92度的苍蓝  阅读(295)  评论(0编辑  收藏  举报
http://images.cnblogs.com/cnblogs_com/Running-Time/724426/o_b74124f376fc157f352acc88.jpg