用toposort和floyd寫對了,用並查集沒有過,暫時不知為何。#include<cstdio>int n;bool hash[101][101];int d[101];int cnt;void init(){ int i,j; cnt=0; for(i=0;i<=n;i++) for(j=0;j<=n;j++) hash[i][j]=0; for(i=0;i<=n;i++) d[i]=0;}void topo(){ bool f; int i,j; while(1) { f=0; for(i=0;i<n;i++) { if(d[i]==0) { cnt++; d[i]--; f=1; for(j=0;j<n;j++) if(hash[i][j]) d[j]--; } } if(f==0) break; }}int main(){ int m,i,x,y; while(scanf("%d%d",&n,&m) && n) { init(); for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); if(x!=y) { if(!hash[x][y]) d[y]++; hash[x][y]=1; } } topo(); if(cnt==n) printf("YES\n"); else printf("NO\n"); } return 0;}#include#includebool map[105][105];int n;void floyd(){ int i,j,k; for(k=0;k<n;k++) for(i=0;i<n;i++) for(j=0;j<n;j++) if(map[i][k]&&map[k][j]) map[i][j]=1;}bool solve(){ int i; for(i=0;i<n;i++) if(map[i][i]) return false; return true;}int main(){ int m,i,x,y; while(scanf("%d%d",&n,&m) && n) { memset(map,0,sizeof(map)); for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); if(x!=y) map[x][y]=1; } floyd(); if(solve()) printf("YES\n"); else printf("NO\n"); } return 0;}