HDU 1285 确定比赛名次【拓扑排序】

题意:中文的题目-----这道题让我终于明白了那个break的作用---因为题目中有这一句“符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前”@_@

#include<iostream>  

#include<cstdio>  

#include<cstring>  

#include<algorithm>  

using namespace std;

int map[505][505],indegree[505],queue[505];

int main()

{

	int n,m,i,j,k,a,b,iq;

	while(scanf("%d %d",&n,&m)!=EOF&&n&&m)

	{

		memset(map,0,sizeof(map));

		memset(indegree,0,sizeof(indegree));

		for(i=1;i<=m;i++)

		{

			scanf("%d %d",&a,&b);

			if(!map[a][b])

			{

				map[a][b]=1;

				indegree[b]++;

			}

		}

		iq=0;

		for(i=1;i<=n;i++)

		{

			for(j=1;j<=n;j++)

			{

				if(indegree[j]==0)

				{

					indegree[j]--;

					queue[iq++]=j;

					break; //每次只扫一次,这样保证了题目中说的"符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前" 

				}				

			}

			

			for(k=1;k<=n;k++)

			{

				if(map[j][k]) indegree[k]--;

				

			}

		}

		

		for(i=0;i<iq-1;i++)

		printf("%d ",queue[i]);

		printf("%d\n",queue[i]);

	}

}

  

 

你可能感兴趣的:(HDU)