http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2140&cid=1803
图结构练习——判断给定图是否存在合法拓扑序列
Time Limit: 1000MS Memory limit: 65536K
题目描述
给定一个有向图,判断该有向图是否存在一个合法的拓扑序列。
输入
输入包含多组,每组格式如下。
第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)
后面m行每行两个整数a b,表示从a到b有一条有向边。
输出
若给定有向图存在合法拓扑序列,则输出YES;否则输出NO。
示例输入
1 0 2 2 1 2 2 1
示例输出
YES NO
这个题就是判断给定图中有无环,有环的话就不是合法的
#include<stdio.h>
#include<string.h>
int mp[15][15];
int vis[30];
int n;
int dfs(int x)
{
int i;
vis[x]=-1;
for(i=1;i<=n;i++)
{
if(mp[x][i])
{
if(vis[i]==-1)
return 0;
else if(!vis[i]&&!dfs(i))
return 0;
}
}
vis[x]=1;
return 1;
}
int judge()
{
int i;
for(i=1;i<=n;i++)
if(!vis[i])
if(!dfs(i))
return 0;
return 1;
}
int main()
{
int m,i,x,y;
while(~scanf("%d %d",&n,&m))
{
memset(mp,0,sizeof(mp));
memset(vis,0,sizeof(vis));
for(i=0;i<m;i++)
{
scanf("%d %d",&x,&y);
mp[x][y]=1;
}
if(judge())
printf("YES\n");
else
printf("NO\n");
}
}