有向图判断是否成环 如果是环输出NO
只要入度为0的点的个数 等于 总的点的个数则无环
#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define LL long long #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define N 200 int in[N]; vector<int>edge[N]; int vis[N][N]; int main() { int n,m; while(RII(n,m)==2&&n&&m) { while(m--) { int a,b; RII(a,b); if(!vis[a][b]) { vis[a][b]=1; in[b]++; edge[a].push_back(b); } } queue<int>q; rep(i,0,n-1) if(!in[i])q.push(i);//后来还要取出来 所以这里cnt不用变 int cnt=0;//计算入读为0的点 while(!q.empty()) { int u=q.front();q.pop(); cnt++; if(edge[u].size()) rep(i,0,edge[u].size()-1) { int v=edge[u][i]; in[v]--; if(in[v]==0)q.push(v); } } if(cnt==n)printf("YES\n"); else printf("NO\n"); CLR(vis,0); rep(i,0,n-1) in[i]=0,edge[i].clear(); } return 0; }