HDU 1269 迷宫城堡

比赛的时候很少做图论的题目,今天开了VC一个来做,貌似是队赛的题目的,一个人挑其他队。。。不过题目相对简单啦,最后排在第4位。

这道题是简单的建模题目,将其看成强连通分量就行了。

第一wa竟然是没看清楚结束条件,好吧,坑了。。

#include <stdio.h>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;

const int maxn = 10001;
int pre[maxn] , lowlink[maxn] , sccno[maxn],dfs_clock,
    scc_cnt;
vector<int> g[maxn];
stack<int> S;
int n , m;

inline int _min(int a,int b) { return a < b ? a : b;} 
void dfs(int u)
{
    pre[u] = lowlink[u] = ++dfs_clock;
    S.push(u);
    for(int i=0;i<g[u].size();i++){
        int v = g[u][i];
        if(!pre[v]) {
            dfs(v);
            lowlink[u] = _min(lowlink[u] , lowlink[v]);
        }
        else if(!sccno[v]){
            lowlink[u] = _min(lowlink[u],pre[v]);
        }
    }
    if(lowlink[u] == pre[u]){
        scc_cnt ++;
        for(;;){
            int x = S.top();
            S.pop();
            sccno[x] = scc_cnt;
            if(x == u) break;
        }
    }
}
void targan(int n){
    dfs_clock = scc_cnt = 0;
    memset(sccno , 0 , sizeof(sccno));
    memset(pre , 0 , sizeof(pre));
    for(int i=0;i<n;i++){
        if(!pre[i]) dfs(i);
    }
}

void prt(){
    printf("-------%d-----------------\n",scc_cnt);
    for(int i=0;i<=n;i++)
        printf("%d %d\n",i , sccno[i]);
    printf("-------------------------\n");
}
void init(){
    for(int i=0;i<=n;i++) g[i].clear();
}
int main()
{
    int a , b;
    while(scanf("%d %d",&n,&m) , n + m)
    {
        init();
        for(int i=0;i<m;i++){
            scanf("%d %d",&a,&b);
            a--,b--;
            g[a].push_back(b);
        }
        targan(n);
        //prt();
        if(scc_cnt == 1) puts("Yes");
        else puts("No");
    }
    return 0;
}        
View Code

posted on 2013-11-28 17:05  从此以后  阅读(248)  评论(0编辑  收藏  举报