您的位置:首页 > 其它

hdu1269——迷宫城堡

2010-09-19 19:52 309 查看
强连通问题,选用tarjan算法,如果单纯的判断,并查集也可以考虑!但,tarjan算法的作用不止可以判断是否连通,还可以求出各个子树!

对于tarjan算法的描述,见:http://www.byvoid.com/blog/scc-tarjan/

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define max 10005
int dfn[max],stack[max],low[max];
int top,index,bcnt;
bool instack[max];
typedef struct arc
{
int adj;
struct arc * nextarc;
}arctype;
typedef struct
{
int v;
arctype * firstarc;
}vertextype;
vertextype g[max];
int n,m;
void ini()
{
int i,k,j,a,b;
arctype * p,*q ;
for(i=1;i<=n;i++)
{
g[i].v=i;
g[i].firstarc =NULL;
}
for(k=0;k<m;k++)
{
scanf("%d%d",&a,&b);
q=(arctype*)malloc(sizeof(arctype));
q->adj =b;
q->nextarc =g[a].firstarc ;
g[a].firstarc =q;
}
}
void tarjan(int i)
{
int j;
arctype * p;
dfn[i]=low[i]=++index;
stack[++top]=i;
instack[i]=true;
p=g[i].firstarc ;
while(p!=NULL)
{
j=p->adj ;
if(!dfn[j])
{
tarjan(j);
if(low[j]<low[i])
low[i]=low[j];
}
else if(instack[j]&&dfn[j]<low[i])
low[i]=dfn[j];
p=p->nextarc;
}
if(dfn[i]==low[i])
{
bcnt++;
do
{
j=stack[top--];
instack[j]=false;
}while(i!=j&&top>0);
}
}
void solve()
{
int i;
top=index=bcnt=0;
memset(dfn,0,sizeof(dfn));
memset(instack,false,sizeof(instack));
for(i=1;i<=n;i++)
{
if(!dfn[i])
tarjan(i);
}
if(bcnt==1)
printf("Yes/n");
else
printf("No/n");
}
main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
ini();
solve();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: