原理:
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 }
原文地址:https://www.cnblogs.com/Leonard-/p/8455296.html
时间: 2024-10-18 02:31:04