您的位置:首页 > 其它

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");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: