题意:判断有向图是否有环;
思路:弗洛伊德求最短路径,然后枚举所有结点是否有
#include<stdio.h>
#define INF 1000000
int dis[101][101],n,m;
void floyd()
{
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(dis[i][k]+dis[k][j]<dis[i][j])
dis[i][j]=dis[i][k]+dis[k][j];
}
void initi()/**初始化*/
{
for(int i=0;i<101;i++)
for(int j=0;j<101;j++)
dis[j][i]=dis[i][j]=INF;
}
int main()
{
while(scanf("%d%d",&n,&m))
{
int a,b,i,j,flag=0;
if(n==0&&m==0)
break;
initi();
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
dis[b][a]=1;/**单向路,使b指向a*/
}
floyd();
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
if(dis[i][j]<INF&&dis[j][i]<INF)/**dis[i][j]<INF表示i,j之间有路*/
{ /**如果i->j和j->i均有路,标记为不合法*/
flag=1;
break;
}
}
if(flag)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
双向的路