HDU — 1629 迷宫城堡(强连通模板题)

来源:互联网 发布:简明python epub 编辑:程序博客网 时间:2024/06/08 06:30

代码实现:

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


0 0
原创粉丝点击