http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2140&cid=1186
就是判断图中是否存在有向环,如果存在,则不是拓扑排序。
1.借助dfs函数判断是否存在环
#include<stdio.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 11
int G[maxn][maxn],vis[maxn],n;
int DFS(int u)
{
vis[u]=-1;//正在访问
for(int v=1; v<=n; v++)
if(G[u][v])
{
if(vis[v]<0)//判断是否有环
return 0;
if(!vis[v] && !DFS(v))
return 0;
}
vis[u]=1;//已访问过
return 1;
}
int toposort()
{
for(int u=1; u<=n; u++)
if(!vis[u] && !DFS(u))
return 0;
return 1;
}
int main()
{
int m,u,v;
while(~scanf("%d%d",&n,&m) && n+m!=0)
{
memset(G,0,sizeof(G));
memset(vis,0,sizeof(vis));
for(int i=0; i<m; i++)
{
scanf("%d%d",&u,&v);
G[u][v]=1;
}
if(toposort())
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
2.根据是否有前驱点判断是否寻在环
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 11
int G[maxn][maxn],vis[maxn],n;
int main()
{
int m,u,v;
while(~scanf("%d%d",&n,&m) && n+m!=0)
{
int bug=0;
memset(G,0,sizeof(G));
memset(vis,0,sizeof(vis));
for(int i=0; i<m; i++)
{
scanf("%d%d",&u,&v);
G[u][v]=1;
vis[v]++;//入度
}
for(int i=0; i<n; i++)//总控
{
int flag=0;
for(u=1; u<=n; u++)
if(vis[u]==0)
{
flag=1;
vis[u]--;//已被访问标记(该值为-1)
for(v=1; v<=n; v++)
if(G[u][v])
vis[v]--;//将关联的顶点的入读减1
break;
}
if(!flag)//存在环
{
bug=1;
break;
}
}
if(bug)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
转载于:https://www.cnblogs.com/guoyongzhi/p/3233006.html