HDU 1285 确定比赛名次(拓扑排序)
2017-03-30 13:06
211 查看
题目描述
有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。输入描述
输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。输出描述
给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。
例子
输入4 3
1 2
2 3
4 3
输出
1 2 4 3
#include <iostream> #include <set> #include <stdio.h> #define MAX 500 using namespace std; set<int>team_in[MAX]; set<int>team_out[MAX]; set<int>ans; int n; void solve() { set<int>::iterator it; int i, t, count = 0, out; while (true) { for (i = 0; i < n; ++i) { if (team_in[i].size() == 0) { ans.insert(i); team_in[i].insert(-1); } } t = *ans.begin(); ans.erase(t); cout << t + 1; ++count; if (count == n) break; cout << " "; for (it = team_out[t].begin(); it != team_out[t].end(); it++) { out = *it; team_in[out].erase(t); } } cout << endl; } int main() { int i, m, x, y; while (cin >> n >> m) { for (i = 0; i < n; i++) { team_in[i].clear(); team_out[i].clear(); } ans.clear(); for (i = 0; i < m; i++) { cin >> x >> y; team_in[y - 1].insert(x - 1); team_out[x - 1].insert(y - 1); } solve(); } }
相关文章推荐
- hdu 1285 确定比赛名次(图论:拓扑排序)
- HDU 1285 确定比赛名次 (拓扑排序)
- hdu 1285 确定比赛名次 (拓扑排序)
- hdu 1285 确定比赛名次 (简单的拓扑排序)
- HDU-1285-拓扑排序-确定比赛名次
- hdu 1285 确定比赛名次 拓扑排序
- HDU 1285——确定比赛名次(拓扑排序入门)
- HDU 1285 确定比赛名次(拓扑排序)
- HDU 1285-确定比赛名次(拓扑排序)
- HDU-1285 确定比赛名次 ---- 拓扑排序
- 拓扑排序 HDU 1285 确定比赛名次
- HDU 1285:确定比赛名次 【拓扑排序】
- Hdu 1285 确定比赛名次,拓扑排序
- HDU-1285-确定比赛名次【拓扑排序模板】
- hdu 1285 确定比赛名次(拓扑排序)
- HDU 1285 确定比赛名次 拓扑排序
- HDU 1285 确定比赛名次 (拓扑排序)
- HDU 1285 确定比赛名次(拓扑排序)
- HDU 1285 确定比赛名次 + HDU 4857 逃生(拓扑排序由浅入深)
- 拓扑排序模版--hdu 1285 确定比赛名次