拓扑排序模版

 

 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 }
队列实现(无注释版)

 

你可能感兴趣的:(排序)