您的位置:首页 > 编程语言

如何编程求有向图的单向连通分支

2010-08-05 21:31 113 查看
void pjg(void)
{
int i,*vh;
if(rdata("input.dat")<0)//读有向图数据
{ printf("数据文件数据读入不正确!"); exit(1);}
vmk=(int *)malloc(n*sizeof(int));
vh =(int *)malloc(n*sizeof(int));
for(i=0;i<n;++i)
{ vmk[i]=0; vh[i]=0; }
imk=1; vmk[0]=imk; m=1;
while(m<n)
{
lin1:
for(i=0;i<n;++i)//
if(vmk[i]==imk && vh[i]==0)
{vh[i]=1; getpdc(i);
goto lin1;
}
if(m>=n)break;
++imk;
for(i=0;i<n;++i)
if(vmk[i]==0)
{vmk[i]=imk; ++m; break;}
}
free(vh);
}
// 该函数求以入度为0 点的不含回路有向图所有单向连通分支
int **pdh,*vdh,idh,inc;
void gcc(int i0)//
{ int i,j,h;
for(i=0,h=0;i<imk;++i)
if(pdh[i0][i]!=0)
{vdh[idh]=i;++idh;
gcc(i);
--idh; ++h;}
if(h==0)
{ printf("第%d个单向连通分支含点:",++inc);
for(i=0;i<idh;++i)
for(j=0;j<n;++j)if(vmk[j]==vdh[i]+1)printf("%d ",j);
}
}
main()
{ int i,j;
pjg();//求强连通分支
if((pdh=(int **)malloc(imk*sizeof(int *)))==NULL)exit(-3);
if((vdh=(int * )malloc(imk*sizeof(int )))==NULL)exit(-3);
for(i=0;i<imk;++i)
{ if((pdh[i]=(int *)malloc(imk*sizeof(int)))==NULL)exit(-4);
for(j=0;j<imk;++j)pdh[i][j]=0;
}
for(i=0;i<n;++i)
for(j=0;j<n;++j) //有向图强连通聚合变换
if(pd[i][j]!=0 && vmk[i]!=vmk[j])pdh[vmk[i]-1][vmk[j]-1]=1;
inc=0;
for(i=0;i<imk;++i)
{ for(j=0;j<imk;++j)
if(pdh[j][i])goto nline;
vdh[0]=i; idh=1;
gcc(i);
nline: continue;
}
printf("*** 共含%d个单向连通分支! ***",imk);
for(i=0;i<n;++i)free(pd[i]);
for(i=0;i<imk;++i)free(pdh[i]);
free(pd);free(vmk);
free(pdh);free(vdh); exit(0);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: