hdu1269 迷宫城堡

Posted wyh447154317

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu1269 迷宫城堡相关的知识,希望对你有一定的参考价值。

跑一遍tarjan,判断一下是否是强连通图

#include<bits/stdc++.h>
using namespace std;
const int M=1e5+5;
const int N=1e4+5;
struct E{
    int to,next;
}e[M];
int head[N],dfn[N],low[N],belong[N],tot,cnt,bcnt;
stack<int>s;
void add(int u,int v){
    e[++tot].to=v;
    e[tot].next=head[u];
    head[u]=tot;
}
void tarjan(int u){
    int v;
    dfn[u]=low[u]=++cnt;
    s.push(u);
    for(int i=head[u];i;i=e[i].next){
        v=e[i].to;
        if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
        else if(!belong[i]) low[u]=min(low[u],dfn[v]);
    }
    if(dfn[u]==low[u]){
        ++bcnt;
        do{ v=s.top();
            s.pop();
            belong[v]=bcnt;
        }while(u!=v);//不能在内部定义v 
    }
}
int main(){
    int n,m;
    while(scanf("%d%d",&n,&m)){
        if(n==0&&m==0)break;// 
        memset(e,0,sizeof(e));
        memset(dfn,0,sizeof(dfn));
        memset(low,0,sizeof(low));
        memset(head,0,sizeof(head));//
        memset(belong,0,sizeof(belong));
        bcnt=cnt=tot=0;
        for(int i=1;i<=m;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            add(x,y);
        }
        for(int i=1;i<=n;i++)
         if(!dfn[i])tarjan(i);
        if(bcnt==1)printf("Yes
");
        else printf("No
");
    }
    return 0;
}

 

以上是关于hdu1269 迷宫城堡的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1269 迷宫城堡

HDU 1269 迷宫城堡(DFS)

hdu 1269 迷宫城堡

HDU1269 迷宫城堡

HDU 1269:迷宫城堡(强连通)

hdu1269 迷宫城堡强连通分量