hdu 1269 迷宫城堡
#include <cstdio> #include <algorithm> #include <vector> #include <stack> #include <cstring> using namespace std; int n,m,dfn[10010],low[10010],scc[10010],scc_cnt,dfs_clock; vector<int> G[10010]; stack<int> s; void dfs(int u){ dfn[u]=low[u]=++dfs_clock; s.push(u); for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(!dfn[v]){ dfs(v); low[u]=min(low[u],low[v]); } else if(!scc[v]){ low[u]=min(low[u],dfn[v]); } } if(low[u]==dfn[u]){ scc_cnt++; for(;;){ int x=s.top(); s.pop(); scc[x]=scc_cnt; if(x==u)break; } } } int main(){ while(scanf("%d%d",&n,&m)){ if(n==0 && m==0)break; dfs_clock=scc_cnt=0; memset(low,0,sizeof(low)); memset(dfn,0,sizeof(dfn)); memset(scc,0,sizeof(scc)); for(int i=1;i<=n;i++)G[i].clear(); for(int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); G[u].push_back(v); } for(int i=1;i<=n;i++)if(!scc[i])dfs(i); if(scc_cnt==1)puts("Yes"); else puts("No"); } return 0; }