强连通分量[trajan]
2013-05-04 09:05
204 查看
http://poj.org/problem?id=2186
View Code
View Code
const int MM = 11111; #define debug puts("wrong") typedef __int64 int64; int N,M; vector<int>edge[MM]; const int maxn = 11111; //节点数 bool instack[maxn]; int ief,top,bcnt,st[maxn]; int low[maxn],dfn[maxn],belong[maxn]; int out[MM]; void get_data() { int i,j,k,x,y; for(i=0;i<=N;i++) edge[i].clear(); for(i=0;i<M;i++) { scanf("%d%d",&x,&y); edge[x].push_back(y); } } void get_init(int n) { //节点数 for(int i=0;i<=n;i++) low[i]=dfn[i]=instack[i]=belong[i]=0; top=bcnt=0; ief=1; } void trajan(int u) { int i,j,k,v; dfn[u]=low[u]=ief++; st[top++]=u; instack[u]=true; for(i=0;i<edge[u].size();i++) { v=edge[u][i]; if(!dfn[v]) trajan(v); if(low[u]>low[v]) low[u]=low[v]; else if(instack[v] && dfn[v]<low[u]) low[u]=dfn[k]; } if(low[u]==dfn[u]) { bcnt++; do { v=st[--top]; instack[v]=false; belong[v]=bcnt; }while(u!=v); } } int get_ans(int x) { int res=0; for(int i=1;i<=N;i++) if(belong[i]==x) res++; return res; } void solve() { int i,j,k,v; get_init(N); for(i=1;i<=N;i++) if(!dfn[i]) trajan(i); for(i=1;i<=N;i++) out[i]=0; for(i=1;i<=N;i++) { for(j=0;j<edge[i].size();j++) { v=edge[i][j]; if(belong[i]!=belong[v]) out[belong[i]]++; } } int res,cc=0; for(i=1;i<=bcnt;i++) if(!out[i]) cc++,res=i; if(cc>1) puts("0"); else printf("%d\n",get_ans(res)); }
相关文章推荐
- 求有向图强连通分量:Trajan算法模板
- 有向图的强连通分量
- POJ 1523 SPF(割点所割连通分量数)
- 强连通分量-tarjan算法
- poj 1523 求无向图所有割点以及删除割点后连通分量个数 给出详细算法思路
- Network of Schools POJ - 1236 tarjan强连通分量
- 第十二章 ALDS1_11_D:Connected Components 连通分量
- POJ1523(tarjan割点后,连通分量有多少)
- 有向图的强连通分量
- 求无向图的连通分量 算法
- POJ 2942 Knights of the Round Table 点重连通分量+交叉染色判奇圈
- poj 1236(tarjam)强连通分量
- 求强连通分量的三种算法——Kosaraju, Tarjan, Gabow
- 强连通分量
- Network of Schools hoj&poj 强连通分量的应用 经典题!
- 有向图强连通分量Tarjan
- 有向图强连通分量的Tarjan算法
- POJ 2236 Wireless Network 【并查集的简单应用 判断是否在同一连通分量】
- HDU 1269 迷宫城堡(裸强连通分量,3级)
- 并查集找连通分量的个数