HDU 1285 确定比赛名次(简单拓扑排序)

题目链接: 传送门

确定比赛名次

Time Limit: 1000MS     Memory Limit: 65536K

Description

有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。

Input

输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。

Output

给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。
其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。

Sample Input

4 3
1 2
2 3
4 3

Sample Output

1 2 4 3
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;

int main() 
{
	int N,M;
	while (~scanf("%d%d",&N,&M))
	{
		int Indegree[505] = {0};
		vector<int>Map[505],Vex;
		priority_queue<int,vector<int>,greater<int> >que;
		int p1,p2;
		while (M--)
		{
			scanf("%d%d",&p1,&p2);
			Map[p1].push_back(p2);
			Indegree[p2]++;
		}
		
		for (int i = 1;i <= N;i++)
		{
			if (Indegree[i] == 0)
			{
				que.push(i);
			}
		}
		
		while (!que.empty())
		{
			int val = que.top();
			que.pop();
			Vex.push_back(val);
			for (int i = 0;i < Map[val].size();i++)
			{
				if (--Indegree[Map[val][i]] == 0)
				{
					que.push(Map[val][i]);
				}
			}
		}
		bool first = true;
		for (int i = 0;i < Vex.size();i++)
		{
			first?printf("%d",Vex[i]):printf(" %d",Vex[i]);
			first = false; 
		}
		printf("\n");
	}
	return 0;
}
posted @   zxzhang  阅读(229)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示

目录导航