挺有意思的一题,被Yes和YES wa了n次
用邻接表 然后判断出对列数,等于不等于n说明有环;
这题其实也就是判断是否存在环而已。
逆向拓扑,能使节点小的尽可能排在前面
#include<iostream> #include<algorithm> #include<stdlib.h> #include<string.h> #include<math.h> #include<string> #include<vector> #include<queue> #include<list> using namespace std; typedef long long lld; typedef unsigned int ud; #define Inf INT_MAX/2//int最大 #define Min(x,y) (x)<(y)?(x):(y) #define Max(x,y) (x)>(y)?(x):(y) #define MemsetMax(a) memset(a,100,sizeof a) #define MemsetZero(a) memset(a,0,sizeof a) #define MemsetMin(a) memset(a,-1,sizeof a) #define PQ priority_queue #define Q queue #define N 102 struct Node { int v,next; }edge[N]; int head[N],ind[N]; int n,m; int main() { while(scanf("%d%d",&n,&m)&&n&&m) { MemsetMin(head); MemsetZero(ind); for(int i=0;i<m;i++) { int a,b; scanf("%d%d",&a,&b); edge[i].v=b; edge[i].next=head[a]; head[a]=i; ind[b]++; } int sum=0; Q<int> q; for(int i=0;i<n;i++) if(ind[i]==0) q.push(i); while(!q.empty()) { int e=q.front(); q.pop(); sum++; for(int i=head[e];i!=-1;i=edge[i].next) if(--ind[edge[i].v]==0) q.push(edge[i].v); } /* bool f=false; for(int i=0;i<n;i++) if(ind[i]!=0) f=true;*/ if(sum!=n) printf("NO\n"); else printf("YES\n"); } return 0; } /* 3 2 0 1 1 2 2 2 0 1 1 0 0 0 */