拓扑排序模版
1 /* 2 TopoSort:拓扑排序 3 in[]:每个点的入度; ans[]:排序后的结果; 4 return:true:有环;false:无环 5 */ 6 bool TopoSort(void) 7 { 8 memset (in, 0, sizeof (in)); //入度清空 9 for (int i=1; i<=n; ++i) 10 for (int j=0; j<G[i].size (); ++j) in[G[i][j]]++; //所有有箭头指向的点的入度累加 11 12 queue<int> Q; int cnt = 0; 13 for (int i=1; i<=n; ++i) {if (!in[i]) Q.push (i);} //先找出入读为0的点,升序入队 14 15 while (!Q.empty ()) 16 { 17 int u = Q.front (); Q.pop (); 18 ans[++cnt] = u; //ans[]存储拓扑排序后的点 19 for (int j=0; j<G[u].size (); ++j) 20 { 21 int v = G[u][j]; 22 in[v]--; //每次减少一个入度 23 if (!in[v]) Q.push (v); //若为0,应最先入队,拓扑序靠前 24 } 25 } 26 27 if (cnt == n) return false; 28 else return true; //若没有n个点,表示有环,YES 29 }
1 bool TopoSort(void)
2 {
3 memset (in, 0, sizeof (in));
4 for (int i=1; i<=n; ++i)
5 for (int j=0; j<G[i].size (); ++j) in[G[i][j]]++;
6
7 queue<int> Q; int cnt = 0;
8 for (int i=1; i<=n; ++i) {if (!in[i]) Q.push (i);}
9
10 while (!Q.empty ())
11 {
12 int u = Q.front (); Q.pop ();
13 ans[++cnt] = u;
14 for (int j=0; j<G[u].size (); ++j)
15 {
16 int v = G[u][j];
17 in[v]--;
18 if (!in[v]) Q.push (v);
19 }
20 }
21
22 if (cnt == n) return false;
23 else return true;
24 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。