hdu1269——迷宫城堡
2010-09-19 19:52
309 查看
强连通问题,选用tarjan算法,如果单纯的判断,并查集也可以考虑!但,tarjan算法的作用不止可以判断是否连通,还可以求出各个子树!
对于tarjan算法的描述,见:http://www.byvoid.com/blog/scc-tarjan/
对于tarjan算法的描述,见:http://www.byvoid.com/blog/scc-tarjan/
#include<stdio.h> #include<malloc.h> #include<string.h> #define max 10005 int dfn[max],stack[max],low[max]; int top,index,bcnt; bool instack[max]; typedef struct arc { int adj; struct arc * nextarc; }arctype; typedef struct { int v; arctype * firstarc; }vertextype; vertextype g[max]; int n,m; void ini() { int i,k,j,a,b; arctype * p,*q ; for(i=1;i<=n;i++) { g[i].v=i; g[i].firstarc =NULL; } for(k=0;k<m;k++) { scanf("%d%d",&a,&b); q=(arctype*)malloc(sizeof(arctype)); q->adj =b; q->nextarc =g[a].firstarc ; g[a].firstarc =q; } } void tarjan(int i) { int j; arctype * p; dfn[i]=low[i]=++index; stack[++top]=i; instack[i]=true; p=g[i].firstarc ; while(p!=NULL) { j=p->adj ; if(!dfn[j]) { tarjan(j); if(low[j]<low[i]) low[i]=low[j]; } else if(instack[j]&&dfn[j]<low[i]) low[i]=dfn[j]; p=p->nextarc; } if(dfn[i]==low[i]) { bcnt++; do { j=stack[top--]; instack[j]=false; }while(i!=j&&top>0); } } void solve() { int i; top=index=bcnt=0; memset(dfn,0,sizeof(dfn)); memset(instack,false,sizeof(instack)); for(i=1;i<=n;i++) { if(!dfn[i]) tarjan(i); } if(bcnt==1) printf("Yes/n"); else printf("No/n"); } main() { while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; ini(); solve(); } }
相关文章推荐
- 迷宫城堡 HDU - 1269(tarjan求强联通)
- hdu 1269 迷宫城堡 (并查集)
- [二维并查集/强连通图]hdu 1269 迷宫城堡
- hdu1269——迷宫城堡
- hdu 1269 迷宫城堡 强连通分量
- hdu 1269 迷宫城堡 (tarjan算法学习)
- hdu 1269 迷宫城堡 判断图是否强连通
- HDU 1269 迷宫城堡(tarjan强联通分量)
- 迷宫城堡 HDU - 1269(tarjan求强联通)
- hdu 1269 迷宫城堡 (并查集)
- HDU 1269-迷宫城堡(强连通分量)
- hdu 1269 迷宫城堡
- HDU 1269 迷宫城堡(tarjan求连通分量)
- HDU 1269 迷宫城堡
- HDU 1269 迷宫城堡
- HDU1269——Tarjan——迷宫城堡
- hdu 1269 迷宫城堡(Tarjan算法)
- hdu 1269 迷宫城堡
- HDU 1269 迷宫城堡 (tarjan scc)
- HDU 1269 迷宫城堡 (有向图强连通分量Tarjan)