题意:很好懂。其实就是大小关系,如果a>b ,b>c 如果再出现个c>a即不合法。
思路:floyd传递闭包。
floyd的典型应用了。
floyd处理之后,如果mat[a][a]=true,即可说明出现了闭环。即不合法。
#include<iostream> using namespace std; const int N=105; int n,m; bool mat[N][N]; void floyd() { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(mat[i][k]&&mat[k][j]) { mat[i][j]=true; } } } int main() { while(scanf("%d%d",&n,&m),n!=0||m!=0) { memset(mat,0,sizeof(mat)); int a,b; for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); mat[a][b]=true; } floyd(); bool flag=true; for(int i=1;i<=n;i++) { if(mat[i][i]) { flag=false; break; } } if(flag) printf("No\n"); else printf("Yes\n"); } }