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;
}