标签:
判断是不是只有一个强连通分量,Kosaraju算法。
/* 有向图强连通分量的求解 */ #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; const int maxn=10000+10; vector<int>G[maxn]; vector<int>FG[maxn]; int Flag[maxn]; int n,m,tot; int dfn[maxn]; struct Node { int id,val; } node[maxn]; void init() { for(int i=0; i<=n; i++) G[i].clear(); for(int i=0; i<=n; i++) FG[i].clear(); memset(dfn,0,sizeof(dfn)); memset(Flag,0,sizeof(Flag)); tot=1; } void Dfs(int now) { dfn[now]=tot; tot++; for(int i=0; i<G[now].size(); i++) if(!dfn[G[now][i]]) Dfs(G[now][i]); } bool cmp(const Node&a,const Node&b) { return a.val<b.val; } void DFS(int now) { Flag[now]=1; for(int i=0; i<FG[now].size(); i++) if(!Flag[FG[now][i]]) DFS(FG[now][i]); } int main() { while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; init(); for(int i=0; i<m; i++) { int u,v; scanf("%d%d",&u,&v); G[u].push_back(v); FG[v].push_back(u); } Dfs(1); for(int i=0; i<n; i++) { node[i].id=i+1; node[i].val=dfn[i+1]; } sort(node,node+n,cmp); DFS(node[0].id); int ans=1; for(int i=1; i<=n; i++) if(!Flag[i]) ans=-1; if(ans==1) printf("Yes\n"); else printf("No\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/zufezzt/p/4720368.html