HDOJ 1269(Tarjan)
2014-04-30 18:36
309 查看
思路:Tarjan
/*===================================================================== # Author: wangzhili # Mail : wangstdio.h@gmail.com # QQ : 240130760 # Filename: tarjan.c # Last modified: 2013-12-06 09:18 =====================================================================*/ #include<stdio.h> #include<string.h> typedef struct { int to; int next; }EdgeNode; EdgeNode edge[100005]; int dfn[10005],low[10005]; int head[10005],vis[10005]; int stack[10005]; int top,ind,cnt,n,m; int min(int x,int y) { return x < y ? x : y; } void tarjan(int i) { int j,v; dfn[i] = low[i] = ++ind; stack[++top] = i; vis[i] = 1; for(j = head[i]; j != -1;j = edge[j].next) { v = edge[j].to; if(!dfn[v]) { tarjan(v); low[i] = min(low[i],low[v]); } else if(vis[v]) low[i] = min(low[i],dfn[v]); } if(dfn[i] == low[i]) { cnt ++; do { j = stack[top--]; vis[j] = 0; }while(j != i); } } void solve() { int i; cnt = 0; top = ind = 0; memset(dfn,0,sizeof(dfn)); memset(vis,0,sizeof(vis)); for(i = 1;i <= n;i ++) { if(!dfn[i]) tarjan(i); } return ; } int main() { int i,j; int a,b; freopen("in.c","r",stdin); while(~scanf("%d%d",&n,&m) && (m+n)) { memset(head,-1,sizeof(head)); for(i = 0;i < m;i ++) { scanf("%d%d",&a,&b); edge[i].to = b; edge[i].next = head[a]; head[a] = i; } solve(); if(cnt == 1) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- HDOJ 1269(Tarjan)
- 1986年的图灵奖获得者-Robert Endre. Tarjan(与John E. Hopcroft共同获得)
- tarjan模板
- HDU1269 迷宫城堡(tarjan判断强连通)
- POJ - 2186 Tarjan的模板题..
- Tarjan
- pku 2117 tarjan算法求割点
- 【tarjan求双连通分量】PKU-3177&3352
- pku 3592 Instantaneous Transference tarjan缩点重建图+spfa求最长路
- hdu 1269 强联通分量 Tarjan
- POJ 2553The Bottom of a Graph(Tarjan)
- poj 3694&&hdu 2460 (手写递归栈版的tarjan)
- poj 3114 Countries in War(tarjan + spfa)
- poj1330 lca_tarjan || 并查集
- poj1523SPF(Tarjan)
- POJ 1470 Closest Common Ancestors (Tarjan)
- tarjan详解(转)
- LCA 最近公共祖先 tarjan离线 总结 结合3个例题
- poj 3180 The Cow Prom(强连通分量 Tarjan)
- Strongly connected 挺简单的tarjan