强联通 HDU 1269

第一道强联通的题目纪念一下! 主要是模版 tarjan算法

 

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <cstring>
using namespace std;
#define INF 0xfffffff
#define maxn 10005
#define min(a,b) (a<b?a:b)

int n, m, time;
vector<int> G[maxn];
stack<int> S;
bool inStack[maxn];
int low[maxn], dfn[maxn];

void tarjan(int u)
{
    int i, len = G[u].size(), v;
    low[u] = dfn[u] = time ++;
    inStack[u] = true;
    S.push(u);
    for(i=0; i<len; i++)
    {
        int v = G[u][i];

        if( !low[v] )
        {
            tarjan(v);
            low[u] = min(low[u], low[v]);
        }
        else if(inStack[v])
        {
            low[u] = min(low[u], dfn[v]);
        }
    }
    do
    {
        v = S.top();
        S.pop();
        inStack[v] = false;
    }while(u != v);
}

void init()
{
    int i;
    memset(low, 0, sizeof(low));
    time = 1;
    for(i=1; i<=n; i++)
        G[i].clear();
}

bool canSolve()
{
    int i;
    for(i=1; i<=n; i++)
    {
        if(low[i] != 1)
            return false;
    }
    return true;
}

int main()
{
    int i;
    while(scanf("%d%d",&n,&m), m+n )
    {
        int a, b;
        init();
        for(i=0; i<m; i++)
        {
            scanf("%d%d",&a,&b);
            G[a].push_back(b);
        }

        tarjan(1);

        if( canSolve() )
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

 

posted @ 2015-04-27 09:55  向前走丶不回首  阅读(121)  评论(0编辑  收藏  举报