题目描述
给定一个有向图,判断该有向图是否存在一个合法的拓扑序列。
输入
输入包含多组,每组格式如下。
第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)
后面m行每行两个整数a b,表示从a到b有一条有向边。
输出
若给定有向图存在合法拓扑序列,则输出YES;否则输出NO。
示例输入
1 0 2 2 1 2 2 1
示例输出
YES NO
拓扑序列判断有没有环
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int map[101][101],du[120];
int n,m,flag;
int topsort()
{
int i,j,k;
for(i=0; i<n; i++)
{
int tmp=n;//用来判断tmp的值是否会改变,若改变说明有度为0的点,若不改变说明有环。
for(j=0; j<n; j++)
{
if(du[j]==0)
{
tmp=j;//用来给它的下一个节点的度提供“ 横坐标”。
du[j]--;//避免重复,相当于删除这个点
break;
}
}
if(tmp==n)//若tmp的值不改变,说明没有入度为0的点。返回
{
return 0;
}
for(k=0; k<n; k++)
{
if(map[tmp][k]==1)
{
du[k]--;//找到入度为1的点减1;
}
}
}
return 1;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(map,0,sizeof(map));
memset(du,0,sizeof(du));
int a,b;
for(int i=0; i<m; i++)
{
scanf("%d%d",&a,&b);
if(map[a][b]==0)//防止重复的边使度的数目不为1。
{
map[a][b]=1;
du[b]++;
}
}
flag=topsort();
if(flag!=0)
printf("YES\n");
else printf("NO\n");
}
return 0;
}