拓扑排序(判断是否是有向无环图)
2015-05-28 19:32
316 查看
要进行拓扑排序之前,该图要是有向无环图。
排序方法:
1、从有向图中选取一个没有前驱的顶点,并输出之
;2、从有向图中删去此顶点以及所有以它为尾的弧;
3、重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。
for(int i=0;i<cnt;i++)
printf("%d ",kj[i]);
排序方法:
1、从有向图中选取一个没有前驱的顶点,并输出之
;2、从有向图中删去此顶点以及所有以它为尾的弧;
3、重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; const int maxn=100001; const int inf=1<<29; int e,head[maxn],pnt[maxn],nxt[maxn]; int cnt_in[maxn],cnt_out[maxn]; bool vis[maxn]; int n,m,k; void AddEdge(int u,int v) { pnt[e]=v;nxt[e]=head[u];head[u]=e++; } int main() { int tt; scanf("%d",&tt); while(tt--) { scanf("%d%d",&n,&m); e=0; memset(head,-1,sizeof(head)); memset(cnt_in,0,sizeof(cnt_in)); memset(cnt_out,0,sizeof(cnt_out)); memset(vis,0,sizeof(vis)); for(int i=0;i<m;i++) { int u,v; scanf("%d%d",&u,&v); AddEdge(u,v); cnt_out[u]++; cnt_in[v]++; } /*for(int i=1;i<=n;i++) { printf("%d :",i); printf("%d %d\n",cnt_in[i],cnt_out[i]); }*/ int cnt=0; int kj[maxn]; while(1) { int f=0; for(int u=1;u<=n;u++) { if(cnt_in[u]==0&&!vis[u]) { f=1; for(int i=head[u];i!=-1;i=nxt[i]) { cnt_in[pnt[i]]--; } kj[cnt++]=u; vis[u]=1; } } if(cnt==n||f==0) break; } int k2=0; for(int i=1;i<=n;i++)//如果所有的数字的入度都为0,代表这是一个无环图。 if(vis[i]==0) k2=1; if(k2==1) puts("Wrong"); else puts("Correct"); } return 0; }而拓扑排序 只要将上面的数组kj[]从小到大输出即可。
for(int i=0;i<cnt;i++)
printf("%d ",kj[i]);
相关文章推荐
- 拓扑排序——判断有向图是否存在回路
- 判断有向图是否有环之拓扑排序-LeetCode 207. Course Schedule
- 拓扑排序 (判断有向图是否存在回环)
- hdoj 3342 Legal or Not 【拓扑排序 判断是否存在可行解】
- 对AOV(DAG的一种,Activity on vertex)拓扑排序得到chain(人为添加边构成全序)来判断AOV是否有环
- 拓扑排序(判断是否存在环,或者对有关任务进行排序进行排序)
- 判断有向图是否存在回路—拓扑排序
- HDOJ 4324 Triangle LOVE(拓扑排序判断有向图是否存在环)
- UVa 1572 拓扑排序 判断有向图是否有环
- 代码判断判断给定的图是否是有向无环图
- 题目1448:Legal or Not(有向无环图判断——拓扑排序问题)
- poj 2585,zoj 2193 Window Pains【拓扑排序思想判断图是否存在环】
- [SDUT](2140)图结构练习——判断给定图是否存在合法拓扑序列 ---拓扑排序(图)
- hdu 2647(拓扑排序,判断有向图是否存在回路及自环,并统计每个顶点的前驱点数)
- 拓扑排序 --- 判断是否有回路
- hdu_3342_拓扑排序判断是否有环
- 图结构练习——判断给定图是否存在合法拓扑序列(拓扑排序判断环)
- 利用拓扑排序判断是否有环(闭合回路)
- 判断给定图是否存在合法拓扑排序
- 拓扑排序 判断是否有环