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

模板:拓扑排序

时间:2018-02-20 16:21:59      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:memset   style   拓扑排序   span   else   queue   有向图   size   dag   

原理:

1.从DAG图中选一个 没有前驱(即入度为0)的顶点并输出
2.从图中删除该顶点和所有以它为起点的有向边
3.重复1和2直到当前的DAG为空或当前图中不存在无前驱的顶点为止,后一种情况说明有向图中一定有环。

 

 1 int n;
 2 int in[N];
 3 bool E[N][N];
 4 queue <int> Q;
 5 
 6 void toposort(){
 7     for(int i=1;i<=n;i++){
 8         //寻找入度为0的点
 9         int j=1;
10         while(in[j]!=0) j++;
11         in[j]--;
12         Q.push(j);
13         //将关联的点的入度减1,即删除与该节点关联的边
14         for(int k=1;k<=n;k++){
15             if(E[j][k]) in[k]--;
16         }
17     }
18 }

 

拓扑排序判环:

 1 //n^2判环
 2 
 3 int n;
 4 const int N=5e2+10;
 5 int E[N][N],vis[N];//vis[i]=0,-1,1分别表示未访问、正在访问、已访问并且已递归访问完所有子孙
 6 
 7 bool dfs(int u){
 8     vis[u]=-1;
 9     for(int i=1;i<=n;i++){
10         if(E[u][i]){
11             if(vis[i]<0) return false;
12             else if(!vis[i]&&!dfs(i)) return false;
13         }
14     }
15     vis[u]=1;
16     ans.push(u);
17     return true;
18 }
19 
20 bool toposort(){
21     memset(vis,0,sizeof(vis));
22     for(int i=1;i<=n;i++){
23         if(!vis[i]){
24             if(!dfs(i)) return false;
25         }
26     }
27     return true;
28 }

 

模板:拓扑排序

标签:memset   style   拓扑排序   span   else   queue   有向图   size   dag   

原文地址:https://www.cnblogs.com/Leonard-/p/8455296.html

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