hdu 1285 确定比赛名次

主要思想就是:

对一个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;//记录入度为0的点
		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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值