码迷,mamicode.com
首页 > 编程语言 > 详细

拓扑排序模版

时间:2015-05-04 11:50:59      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:

 

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

 

拓扑排序模版

标签:

原文地址:http://www.cnblogs.com/Running-Time/p/4475695.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!