hdu 1269 ( 迷宫城堡 ) (求强连通分量)

很明显,如果这个有向图只有一个强连通分量,则输出Yes,否则No,tarjan算法即可

#include <stdio.h>
#include <string.h>

 

#define VN 10010

 

typedef struct ENode
{
    int v;
    ENode *next;
} ENode;
typedef struct VNode
{
    ENode *first;
} VNode;
VNode adjlist[VN];

int N,M;

void insert(int i,int j)
{
    ENode *p=new ENode;
    p->v=j;
    p->next=adjlist[i].first;
    adjlist[i].first=p;
}

void display()
{
    ENode *p;
    int i;
    for(i=1; i<=N; i++)
    {
        printf("%2d: ",i);
        p=adjlist[i].first;
        while(p)
        {
            printf(" -> %2d ",p->v);
            p=p->next;
        }
        printf("\n");
    }
}

int DFN[VN],LOW[VN],vcnt,bcnt,stack[VN],top;
bool instack[VN];

inline void init()
{
    memset(adjlist,0,4*(N+1));
    memset(instack,0,N+1);
    memset(DFN,0,4*(N+1));
    vcnt=bcnt=0;
    top=-1;
}

void tarjan(int u)
{
    DFN[u]=LOW[u]=++vcnt;
    stack[++top]=u;
    instack[u]=true;
    ENode *p;
    int j;
    for(p=adjlist[u].first; p; p=p->next)
    {
        j=p->v;
        if(DFN[j]==0)
        {
            tarjan(j);
            if(LOW[u]>LOW[j])
                LOW[u]=LOW[j];
        }
        else if(instack[j] && LOW[u]>DFN[j])
        {
            LOW[u]=DFN[j];
        }
    }
    if(LOW[u]==DFN[u])
    {
        bcnt++;
        do
        {
            j=stack[top--];
            instack[j]=false;
        }
        while(j!=u);
    }
}

int main()
{
    while(scanf("%d %d",&N,&M)!=EOF && N)
    {
        init();
        int i,j;
        while(M--)
        {
            scanf("%d %d",&i,&j);
            insert(i,j);
        }
        for(i=1; i<=N; i++)
            if(DFN[i]==0)
                tarjan(i);
        if(bcnt>1)    printf("No\n");
        else printf("Yes\n");
    }
    return 0;
}

 

posted @ 2010-08-18 17:26  菜到不得鸟  阅读(461)  评论(0)    收藏  举报