HDU — 1629 迷宫城堡(强连通模板题)
2015-04-26 17:44
483 查看
代码实现:
#include<stdio.h> #include<string.h> const int maxn=10010; int dfn[maxn],low[maxn],instack[maxn],Stap[maxn],n,m,top,Stop,Bcnt,Dindex; struct Edge{ int v; Edge *next; Edge(int vv=0,Edge *p=0):v(vv),next(p){} }*head[maxn],e[100010]; void Addedge(int from,int to){ Edge *p=&e[top++]; p->v=to; p->next=head[from]; head[from]=p; } void Tarjan(int i){ int j; dfn[i]=low[i]=++Dindex; instack[i]=1; Stap[++Stop]=i; for(Edge *p=head[i];p;p=p->next){ j=p->v; if(!dfn[j]){ Tarjan(j); if(low[j]<low[i]) low[i]=low[j]; } else if(instack[i]&&dfn[j]<low[i]) low[i]=dfn[j]; } if(dfn[i]==low[i]){ Bcnt++; while(1){ j=Stap[Stop--]; instack[j]=0; if(j==i) break; } } } int main(){ while(~scanf("%d%d",&n,&m),(n||m)){ int a,b; memset(dfn,0,sizeof(dfn)); memset(instack,0,sizeof(instack)); memset(head,0,sizeof(head)); top=Stop=Bcnt=Dindex=0; while(m--){ scanf("%d%d",&a,&b); Addedge(a,b); } for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i); //printf("%d\n",Bcnt); if(Bcnt==1) printf("Yes\n"); else printf("No\n"); } }
相关文章推荐
- hdu1269 迷宫城堡 (强连通模板)(有向图)
- HDU 1269 迷宫城堡 强联通分量模板存放处
- HDU 1269 迷宫城堡 强连通分量模板题
- hdu 1269 迷宫城堡 (强连通入门题)
- HDU 1269 迷宫城堡(Tarjan or Kosaraju模板)
- HDU 1269 迷宫城堡(强联通模板题)
- HDU 1269 迷宫城堡(强连通)
- 【HDU】1269 迷宫城堡 强连通
- 迷宫城堡 HDU-1269(Tarjan模板题)
- 迷宫城堡 HDU - 1269 (强连通)
- hdu 1269 迷宫城堡 tarjan模板
- HDU - 1269 - 迷宫城堡(强连通)
- HDU 1269 迷宫城堡(强连通)
- hdu1269迷宫城堡 (强连通Tarjan+邻接表)
- HDU 1269 迷宫城堡(强连通)
- HDU 1629 迷宫城堡
- HDU-#1269 迷宫城堡(Tarjan+强连通)
- hdu 1269 迷宫城堡 判断图是否强连通
- HDU 1269 迷宫城堡(强连通模板题)
- HDU 1269 迷宫城堡(有向图的强连通)