hdu 1269 迷宫城堡

#include <cstdio>
#include <algorithm>
#include <vector>
#include <stack>
#include <cstring>
using namespace std;
int n,m,dfn[10010],low[10010],scc[10010],scc_cnt,dfs_clock;
vector<int> G[10010];
stack<int> s;

void dfs(int u){
    dfn[u]=low[u]=++dfs_clock;
    s.push(u);
    for(int i=0;i<G[u].size();i++){
        int v=G[u][i];
        if(!dfn[v]){
            dfs(v);
            low[u]=min(low[u],low[v]);
        }
        else if(!scc[v]){
            low[u]=min(low[u],dfn[v]);
        }
    }
    if(low[u]==dfn[u]){
        scc_cnt++;
        for(;;){
            int x=s.top(); s.pop();
            scc[x]=scc_cnt;
            if(x==u)break;
        }
    }
}

int main(){
    while(scanf("%d%d",&n,&m)){
        if(n==0 && m==0)break;
        dfs_clock=scc_cnt=0;
        memset(low,0,sizeof(low));
        memset(dfn,0,sizeof(dfn));
        memset(scc,0,sizeof(scc));
        for(int i=1;i<=n;i++)G[i].clear();
        for(int i=1;i<=m;i++){
            int u,v;
            scanf("%d%d",&u,&v);
            G[u].push_back(v);
        }
        for(int i=1;i<=n;i++)if(!scc[i])dfs(i);
        if(scc_cnt==1)puts("Yes");
        else puts("No");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/codetogether/p/13305524.html