分析:本题判断一个图是否是有向强连通分量,这里使用tarjan算法求解。
#include<iostream> #include<vector> #include<stack> using namespace std; vector<int> map[10002]; stack<int> tarjan_stack; int low[10002]; int dfn[10002]; bool vis[10002]; int cnt,pos; void Init(int n) { int i; cnt=pos=0; memset(low,0,sizeof(low)); memset(dfn,0,sizeof(dfn)); memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) map[i].clear(); while(!tarjan_stack.empty()) tarjan_stack.pop(); } void Input(int m) { int i,a,b; for(i=1;i<=m;i++) { cin>>a>>b; map[a].push_back(b); } } void tarjan(int u) { int i,t; dfn[u]=low[u]=++pos; vis[u]=true; tarjan_stack.push(u); for(i=0;i<map[u].size();i++) { t=map[u][i]; if(!dfn[t]) { tarjan(t); if(low[t]<low[u]) low[u]=low[t]; } else if(vis[t] && low[u]>dfn[t]) low[u]=dfn[t]; } if(low[u]==dfn[u]) { cnt++; while(!tarjan_stack.empty()) { t=tarjan_stack.top(); tarjan_stack.pop(); vis[t]=false; if(t==u) break; } } } void Solve(int n,int m) { int i; Init(n); Input(m); for(i=1;i<=n;i++) //循环防止是森林的情况也能处理 if(!dfn[i]) tarjan(i); if(cnt==1) puts("Yes"); else puts("No"); } int main() { int N,M; while(cin>>N>>M &&(N||M)) { Solve(N,M); } return 0; }
时间: 2024-11-05 10:24:24