您的位置:首页 > 其它

hdu 1285 确定比赛名次

2011-11-29 12:33 204 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1285

一开始模拟做的,但是不知道错哪了。。后面 看题解才知道要用拓扑排序。。

对于拓扑排序主要分成两步:

第一步:选择一个入度为0的顶点并输入它;

第二步:从网中删去该节点,并且删去从该顶点发出的全部有向边。

重复一二。直到网中所有点已输出。

下面是AC代码:

//拓扑排序。
#include<iostream>
using namespace std;
int team[501][501];
int mark[501];
int main()
{
	int n,m;
	int i,a,b;
	int t,top;
	while(cin>>n>>m)
	{
		memset(team,0,sizeof(team));
		memset(mark,0,sizeof(mark));
		for(i=0;i<m;i++)
		{
			cin>>a>>b;
			if(!team[a][b])
			{
				team[a][b]=1;
				mark[b]++;
			}
		}
		for(i=n;i>=1;i--)
			if(!mark[i])
				top=i;
			t=1;
			
			while(t<=n-1)
			{
				printf("%d ",top);
				mark[top]--;
				t++;
				
				for(i=n;i>=1;i--)
				{
					if(team[top][i])
					{
						mark[i]--;
					}
				}
				for(i=n;i>=1;i--)
				{
					if(!mark[i])
						top=i;
				}
			}
			
			printf("%d\n",top);
	}
	return 0;
	
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: