hdu 3594 仙人掌图

思路:利用它的几条性质

#include<set>

#include<map>

#include<cmath>

#include<queue>

#include<cstdio>

#include<vector>

#include<string>

#include<cstdlib>

#include<cstring>

#include<iostream>

#include<algorithm>

#define pb push_back

#define mp make_pair

#define Maxn 20010

#define Maxm 2000010

#define LL __int64

#define Abs(x) ((x)>0?(x):(-x))

#define lson(x) (x<<1)

#define rson(x) (x<<1|1)

#define inf 100000

#define lowbit(x) (x&(-x))

#define clr(x,y) memset(x,y,sizeof(x))

#define Mod 1000000007

using namespace std;

int dfn[Maxn],low[Maxn],id[Maxn],vi[Maxn],head[Maxn],use[Maxn],e,num,lab;

void init()

{

    clr(dfn,0);

    clr(low,0);

    clr(id,0);

    clr(vi,0);

    clr(use,0);

    clr(head,-1);

    e=num=lab=0;

}

struct Edge{

    int u,v,col,f,next;

}edge[Maxm];

void add(int u,int v)

{

    edge[e].u=u,edge[e].v=v,edge[e].f=edge[e].col=0,edge[e].next=head[u],head[u]=e++;

}

int Tarjan(int u)

{

    int i,v;

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

    vi[u]=1;

    for(i=head[u];i!=-1;i=edge[i].next){

        v=edge[i].v;

        if(use[v]) return 0;

        if(!dfn[v]){

            if(!Tarjan(v))

                return 0;

            if(low[v]>dfn[u]) return 0;

            low[u]=min(low[u],low[v]);

        }

        if(vi[v])

            low[u]=min(low[u],dfn[v]);

    }

    use[u]=1;

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

        if(u!=1)

            return 0;

    }

    return 1;

}

int main()

{

    int t,n,i,j,u,v;

    scanf("%d",&t);

    while(t--){

        init();

        scanf("%d",&n);

        while(scanf("%d%d",&u,&v),u|v){

            add(u,v);

        }

        //cout<<"ok"<<endl;

        int f=Tarjan(1);

        for(i=0;i<n;i++){

            if(!dfn[i]){

                f=0;

                break;

            }

        }

        if(f)

            printf("YES\n");

        else

            printf("NO\n");

    }

    return 0;

}

 

你可能感兴趣的:(HDU)