#include<iostream> #include<stdio.h> #include<algorithm> #include<vector> #include<string> #include<string.h> using namespace std; const int maxx = 100010; int n,m; vector<int>g[maxx]; vector<int>rg[maxx]; vector<int>vs; bool vis[maxx]; int cmp[maxx]; void dfs(int v) { vis[v]=true; for(int i=0;i<g[v].size();i++) { if(!vis[g[v][i]]) dfs(g[v][i]); } vs.push_back(v); } void rdfs(int v) { vis[v]=true; for(int i=0;i<rg[v].size();i++) { if(!vis[rg[v][i]]) rdfs(rg[v][i]); } } int main() { while(scanf("%d%d",&n,&m)&&(n+m)!=0) { for(int i=0;i<=n;i++) { g[i].clear(); rg[i].clear(); } vs.clear(); for(int i=0;i<m;i++) { int tmp1,tmp2; scanf("%d%d",&tmp1,&tmp2); g[tmp1].push_back(tmp2); rg[tmp2].push_back(tmp1); } memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { if(!vis[i]) { dfs(i); } } memset(vis,0,sizeof(vis)); int k=0; for(int i=vs.size()-1;i>-1;i--) { if(!vis[vs[i]]) { rdfs(vs[i]); k++; } } if(k==1) printf("Yes\n"); else printf("No\n"); } return 0; }
先把代码放这,以后有空把学习过程补上。
时间: 2024-10-08 09:48:18