强联通 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;

}

 

你可能感兴趣的:(HDU)