[HDU1269]迷宫城堡(Tarjan求强连通分量)
2016-08-20 15:35
288 查看
题目描述
传送门题解
Tarjan求强连通分量模板题。判断有几个强连通分量即可。
代码
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int max_n=1e4+5; const int max_m=1e5+5; int n,m,x,y,N; int tot,point[max_n],nxt[max_m*2],v[max_m*2]; int Dfn[max_n],Low[max_n],vis[max_n],strack[max_n],temp,cnt; inline void clear(){ tot=0;memset(point,0,sizeof(point));memset(nxt,0,sizeof(nxt));memset(v,0,sizeof(v)); memset(Low,0,sizeof(Low)); memset(Dfn,0,sizeof(Dfn)); memset(strack,0,sizeof(strack)); temp=0; memset(vis,0,sizeof(vis)); cnt=0; } inline void addedge(int x,int y){++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y;} inline void tarjan(int now){ Dfn[now]=Low[now]=++N; strack[++temp]=now; vis[now]=1; for (int i=point[now];i;i=nxt[i]) if (!Dfn[v[i]]){ tarjan(v[i]); Low[now]=min(Low[now],Low[v[i]]); } else Low[now]=min(Low[now],Dfn[v[i]]); if (Low[now]==Dfn[now]){ ++cnt; while (strack[temp]!=now) vis[strack[temp]]=0,temp--; vis[strack[temp]]=0,temp--; } } int main(){ while (~scanf("%d%d",&n,&m)){ if (!n&&!m) return 0; clear(); for (int i=1;i<=m;++i) scanf("%d%d",&x,&y),addedge(x,y); for (int i=1;i<=n;++i) if (!Dfn[i]) tarjan(i); if (cnt==1) printf("Yes\n"); else printf("No\n"); } }
总结
刚开始判断栈空来求答案的做法是错误的。因为栈只是中间过程的一个辅助情况,只是用来判断点的状态,与结果无关。相关文章推荐
- HDU1269 迷宫城堡(强连通分量tarjan入门题)
- HDU - 1269 - 迷宫城堡 (tarjan求强连通分量)
- [置顶] HDOJ 1269 迷宫城堡 (Tarjan + 强连通分量)
- 【HDU1269】迷宫城堡(tarjan)
- hdu 1269 迷宫城堡 tarjan算法求有向图的强连通分量
- HDU1269 迷宫城堡(tarjan判断强连通)
- hdu 1269 迷宫城堡(Tarjan 图的强连通分量)
- 迷宫城堡(hdu1269,强连通分量)
- [HDU1269]迷宫城堡(Tarjan)
- HDU1269 迷宫城堡 —— 强连通分量
- 【模板】【hdu1269】迷宫城堡——tarjan
- HDU 1269:迷宫城堡 (Tarjan强连通分量)
- hdu 1269 迷宫城堡 强连通分量
- 迷宫城堡 HDU - 1269 (tarjan)
- 迷宫城堡 HDU-1269(Tarjan模板题)
- HDU 1269 迷宫城堡【强连通分量_Tarjan算法】
- hdu1269 迷宫城堡 强连通分量 tarjan算法(前向星实现)
- HDU 1269 迷宫城堡 (强连通分量,常规)
- 迷宫城堡 HDU - 1269(tarjan求强联通)
- HDU1269 迷宫城堡(强连通分量,Tarjan算法)