如何编程求有向图的单向连通分支
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);
}
{
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);
}
相关文章推荐
- 我们如何从VC++开始“编程”?
- IE编程精选-如何使用BHO定制你的Internet Explorer浏览器
- 自己觉得写得挺好的一篇文章--如何学好编程
- Unix环境高级编程第三版中实例代码如何在自己的linux上运行的问题
- [转]如何进行 Socket 编程
- 如何提高自己的编程水平?
- 如何学习linux编程
- 如何:在十六进制字符串与数值类型之间转换(C# 编程指南)
- android 蓝牙编程重点---如何发送和接收16进制数据
- 关于ODBC API编程中如何判断DSN是否已存在
- UNIX 编程技巧——如何 hook 一个共享库
- wxwidgets 界面编程如何使用 png 图片
- 第2章 Java编程基础——FAQ2.24 数组如何定义和初始化?
- 如何使用socket进行java网络编程(二)
- Email编程如何实现“代表发送”的功能?
- 1.01一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?
- 我们究竟应该如何学习编程
- 对于不给数量n的编程题,该如何读一行数据(C++)
- Powerbuilder编程技巧 如何获取网页的HTML源码
- 编程两个小问题,C语言中如何读取一行字符串的问题和VS2008中调试出错一个问题