主要思想就是:
对一个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;
}
//求更好的实现代码,哈哈