HDU-1285-确定比赛名次
生活随笔
收集整理的這篇文章主要介紹了
HDU-1285-确定比赛名次
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鏈接:https://vjudge.net/problem/HDU-1285
題意:
有N個比賽隊(1<=N<=500),編號依次為1,2,3,。。。。,N進行比賽,比賽結束后,裁判委員會要將所有參賽隊伍從前往后依次排名,但現在裁判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即P1贏P2,用P1,P2表示,排名時P1在P2之前。現在請你編程序確定排名。?
思路:
拓撲排序,group記錄每個點贏的人,in數組記錄每個點的入度。
對每個入度為0的點添加到優先隊列中,同時取出來的時候把這個點贏的點的入度都減1,題目數據保證正確性。
代碼:
#include <iostream> #include <memory.h> #include <vector> #include <map> #include <algorithm> #include <cstdio> #include <math.h> #include <queue>using namespace std;typedef long long LL;const int MAXN = 500 + 10;vector<int> Group[MAXN]; int in[MAXN]; int n, m;vector<int> topo() {vector<int> res;priority_queue<int> que;for (int i = 1; i <= n;i++)if (in[i] == 0)que.push(-i);while (!que.empty()){int now = -que.top();que.pop();res.push_back(now);for (auto x : Group[now])if (--in[x] == 0)que.push(-x);}return res;}int main() {int l, r;while (~scanf("%d%d", &n, &m)){for (int i = 1;i <= n;i++)Group[i].clear();memset(in, 0, sizeof(in));for (int i = 1; i <= m; i++){scanf("%d%d", &l, &r);Group[l].push_back(r);in[r]++;}vector<int> res = topo();int cnt = 0;for (auto x : res){if (cnt > 0)cout << ' ' ;cout << x;cnt ++;}cout << endl;}return 0; }
轉載于:https://www.cnblogs.com/YDDDD/p/10486596.html
總結
以上是生活随笔為你收集整理的HDU-1285-确定比赛名次的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: XSS中JavaScript加密以及Fi
- 下一篇: dom选择方法的区别