Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2559 Accepted Submission(s): 978
//直接,拓扑排序然后判断是否还有没入队的点就行。 #include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> using namespace std; int n,m,in[110],cnt[110],nu; vector<int>g[110]; void topu() { queue<int>q; nu=0; for(int i=1;i<=n;i++) if(in[i]==0) q.push(i); while(!q.empty()){ int u=q.front();q.pop(); cnt[++nu]=u; for(int i=0;i<g[u].size();i++){ int p=g[u][i]; if(--in[p]==0) q.push(p); } } } int main() { while(scanf("%d%d",&n,&m)==2){ for(int i=0;i<=n;i++){ in[i]=0; g[i].clear(); } int x,y; for(int i=0;i<m;i++){ scanf("%d%d",&x,&y); g[x].push_back(y); in[y]++; } topu(); if(nu>=n) printf("YES\n"); else printf("NO\n"); } return 0; }
原文:http://www.cnblogs.com/--ZHIYUAN/p/6648659.html