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

Posted angel-demon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU-1285-确定比赛名次(拓扑排序)相关的知识,希望对你有一定的参考价值。

  • 拓扑排序
    #include "bits/stdc++.h"
    using namespace std;
    // 用来存某个点的入度数量
    int num[505];
    // 用来存某个节点的出度
    set<int> outde[505];
    int ans[505];
    priority_queue<int, vector<int>, greater<int> > qu;
    int main() {
        int n, m, id, victory, defeat;
        while (~scanf("%d%d", &n, &m)) {
            id = 0;
            while (m--) {
                scanf("%d%d", &victory, &defeat);
                // 去重,这题的坑点,输入数据可能会重复defeat被victory多次打败
                if (outde[victory].count(defeat) == 0) {
                    num[defeat]++;
                    outde[victory].insert(defeat);
                }
            }
            // 把入度为0的点加入优先队列
            for (int i = 1; i <= n; i++) {
                if (num[i] == 0) {
                    qu.push(i);
                }
            }
            while (!qu.empty()) {
                // 取出优先队列中编号最小的点并存到ans数组中去;
                int first = qu.top();
                qu.pop();
                ans[++id] = first;
                // 将first的所以出度的入度数量减1;
                for (int i : outde[first]) {
                    num[i]--;
                    // 如果入度变成了0,就加入优先队列
                    if (num[i] == 0) {
                        qu.push(i);
                    }
                }
                outde[first].clear();
            }
            for (int i = 1; i < n; i++) {
                printf("%d ", ans[i]);
            }
            printf("%d
    ", ans[n]);
        }
        return 0;
    }

     NOTE : 每次将入度为0的点添加到ans末尾的做法是错误的;

以上是关于HDU-1285-确定比赛名次(拓扑排序)的主要内容,如果未能解决你的问题,请参考以下文章

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

HDU 1285 确定比赛名次(拓扑排序+优先队列)

[ACM] hdu 1285 确定比赛名次 (拓扑排序)

HDU 1285 确定比赛名次(拓扑排序模板)

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

HDU 1285 确定比赛名次(拓扑排序基础题)