拓扑排序 入度

  1 //拓扑排序延续之拓扑排序 入度
  2 
  3 #include <iostream>
  4 
  5 #include <stack>
  6 
  7 using namespace std ; 
  8 
  9 const int MAXN = 100 ;
 10 
 11 int G[MAXN][MAXN] , ans[MAXN]  ;
 12 
 13 int n ,count ; bool TopoSort()
 14 
 15 {
 16 
 17 int into[MAXN] ;
 18 
 19 memset(into,0,sizeof(into)) ;  
 20 
 21 memset(ans,0,sizeof(ans)) ;
 22 
 23  for (int i = 0 ; i < n ; ++ i)  
 24 
 25 {  
 26 
 27 for (int j = 0 ; j < n ; ++ j)  
 28 
 29 {   
 30 
 31 if (G[i][j] > 0)   
 32 
 33 {    
 34 
 35 into[j] ++ ;   
 36 
 37 }  
 38 
 39 }  
 40 
 41 } 
 42 
 43  stack<int> s ;  
 44 
 45 for (i = 0 ; i < n ; ++ i)  
 46 
 47 {  
 48 
 49 if (!into[i])  
 50 
 51 {   
 52 
 53 s.push(i) ;   
 54 
 55 into[i] = -1 ;  
 56 
 57 }  
 58 
 59 }  
 60 
 61 while (!s.empty())  
 62 
 63 {  
 64 
 65 int u = s.top() ;  
 66 
 67 s.pop() ;  
 68 
 69 ans[count++] = u ;   
 70 
 71 for (int j = 0 ; j < n ; ++ j)  
 72 
 73 {   
 74 
 75 if (G[u][j])   
 76 
 77 {   
 78 
 79   into[j] -- ;   
 80 
 81 }   
 82 
 83 if (!into[j])   
 84 
 85 {      
 86 
 87 s.push(j) ;    
 88 
 89 into[j] = -1 ;   
 90 
 91 }  
 92 
 93 }  
 94 
 95 }  
 96 
 97 if (count != n)  
 98 
 99 {  
100 
101 return false ;  
102 
103 }
104 
105  return true ;
106 
107 }
108 
109 int main()
110 
111 {  
112 
113 memset(G,0,sizeof(G)) ; 
114 
115  int m ;  
116 
117 cin >> n >> m ;  
118 
119 for(int i = 0 ; i < m ; ++ i)
120 
121  {  
122 
123 int u , v ;  
124 
125 cin >> u >> v ;  
126 
127 G[u][v] = 1 ;
128 
129  } 
130 
131  if (TopoSort())
132 
133  {  
134 
135 for (int i = 0 ; i < n ; ++ i)  
136 
137 {   
138 
139 cout << ans[i] << " " ;  
140 
141 }  
142 
143 cout << endl ;  
144 
145 }
146 
147  else  
148 
149 cout << -1 << endl ;
150 
151  return 0 ;
152 
153 }
154 
155  
View Code

 

转载于:https://www.cnblogs.com/LOB104-zhanglei/articles/3183041.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值