您的位置:首页 > 其它

[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");
}
}


总结

刚开始判断栈空来求答案的做法是错误的。因为栈只是中间过程的一个辅助情况,只是用来判断点的状态,与结果无关。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: