图论之拓扑排序

主要思想就是:

对一个AOV网络进行拓扑排序的方法:

1:从AOV网络中选择一个入度为0(即没有直接前驱)的顶点并输出

2:从AOV网络中删除该顶点及该顶点发出的所有的边

3:重复步骤1和2,直到找不到入度为0的顶点为止

 

按照上面的方法进行拓扑排序其结果有2种:一就是所有的顶点都被输出,也就是整个拓扑排序完成了;二就是仍有顶点未被输出,但剩下的图中再也没有入度为0的顶点,这样的拓扑排序就无法进行下去,这就是说明该AOV图存在有环图。

例题可参照:http://acm.hdu.edu.cn/showproblem.php?pid=1285

 

#include<stdio.h>
#include<string.h>
int Edge[501][501];
int A[501];
int m,n;
void topo(int (*map)[501],int *A,int m)
{
 int i,j,k,len[501];
 for(i=1;i<=m;i++)
 {
  len[i]=0;
  for(j=0;j<=m;j++)//找个顶点的入度
  {
   len[i]+=Edge[j][i];
  }
 }
 for(j=1;j<=m;j++)//拓扑的开始
 {
  for(i=1;i<=m;i++)
  {
   if(len[i]==0)
    break;
  }
  if(i>m)
  {
   return;
  }
  A[j]=i;
  len[i]=-1;//避免再次查找
  for(k=1;k<=m;k++)
  {
   len[k]-=Edge[i][k];//删除与入度为0的顶点的关系
  }
 }
}
int main()
{
 int a,b,i;
 while(scanf("%d%d",&m,&n)!=EOF)
 {
  memset(Edge,0,sizeof(Edge));
  for(i=0;i<n;i++)
  {
   scanf("%d%d",&a,&b);
   Edge[a][b]=1;
  }
  topo(Edge,A,m);
  for(i=1;i<=m;i++)
  {
   printf("%d%c",A[i],i==m?'\n':' ');
  }
 }
 return 0;
}

//求更好的实现代码,哈哈

你可能感兴趣的:(c,网络,ini,IM)