比赛的时候很少做图论的题目,今天开了VC一个来做,貌似是队赛的题目的,一个人挑其他队。。。不过题目相对简单啦,最后排在第4位。
这道题是简单的建模题目,将其看成强连通分量就行了。
第一wa竟然是没看清楚结束条件,好吧,坑了。。

#include <stdio.h> #include <algorithm> #include <vector> #include <stack> using namespace std; const int maxn = 10001; int pre[maxn] , lowlink[maxn] , sccno[maxn],dfs_clock, scc_cnt; vector<int> g[maxn]; stack<int> S; int n , m; inline int _min(int a,int b) { return a < b ? a : b;} void dfs(int u) { pre[u] = lowlink[u] = ++dfs_clock; S.push(u); for(int i=0;i<g[u].size();i++){ int v = g[u][i]; if(!pre[v]) { dfs(v); lowlink[u] = _min(lowlink[u] , lowlink[v]); } else if(!sccno[v]){ lowlink[u] = _min(lowlink[u],pre[v]); } } if(lowlink[u] == pre[u]){ scc_cnt ++; for(;;){ int x = S.top(); S.pop(); sccno[x] = scc_cnt; if(x == u) break; } } } void targan(int n){ dfs_clock = scc_cnt = 0; memset(sccno , 0 , sizeof(sccno)); memset(pre , 0 , sizeof(pre)); for(int i=0;i<n;i++){ if(!pre[i]) dfs(i); } } void prt(){ printf("-------%d----------------- ",scc_cnt); for(int i=0;i<=n;i++) printf("%d %d ",i , sccno[i]); printf("------------------------- "); } void init(){ for(int i=0;i<=n;i++) g[i].clear(); } int main() { int a , b; while(scanf("%d %d",&n,&m) , n + m) { init(); for(int i=0;i<m;i++){ scanf("%d %d",&a,&b); a--,b--; g[a].push_back(b); } targan(n); //prt(); if(scc_cnt == 1) puts("Yes"); else puts("No"); } return 0; }