hdu 1269 迷宫城堡 tarjan判断缩点个数是否为1

/*



题目:

    求图中的任意两顶点是否两两互达



分析:

    tanjan算法求得缩点的个数,判断是否为一即可



*/

#include <iostream>

#include <cstdio>

#include <vector>

#include <cstring>



using namespace std;



const int V = 100005;



vector<int> adj[V];



int dfn[V],stack[V],low[V],bcnt,depth,top;

bool instack[V];

int n,m;

//int father[V];



void tarjan(int u)

{

    instack[u] = true;

    stack[++top] = u;

    low[u] = dfn[u] = ++depth;

    int len = adj[u].size();

    int v;

    for(int i=0;i<len;i++)

    {

        v = adj[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]);

    }

    if(low[u]==dfn[u])

    {

        ++bcnt;

        do

        {

            v = stack[top--];

            instack[v] = false;

            //father[v] = bcnt;

        }while(u!=v);

    }

}



int main()

{

    freopen("sum.in","r",stdin);

    freopen("sum.out","w",stdout);

    int x,y;

    while(scanf("%d%d",&n,&m),n||m)

    {

        for(int i=1;i<=n;i++)

            adj[i].clear();

        for(int i=0;i<m;i++)

        {

            scanf("%d%d",&x,&y);

            adj[x].push_back(y);

        }

        memset(instack,false,sizeof(instack));

        memset(low,0,sizeof(low));

        bcnt = depth = top = 0;

        for(int i=1;i<=n;i++)

            if(!low[i])

                tarjan(i);

        if(bcnt==1)

            cout<<"Yes"<<endl;

        else

            cout<<"No"<<endl;

    }

    return 0;

}

 

你可能感兴趣的:(tar)