BZOJ 4010: [HNOI2015]菜肴制作

NOIP2018 98天倒计时……刷点NOIP题吧_(:з」∠)_

这道题就是逆拓扑排序的裸题,所谓逆拓扑就是倒着拓扑,每次优先取较大的元素,这样就保证了小的元素尽量靠前

如果有环输出Impossible!


我没输出回车! 我没输出回车! 我是SB! 我是SB! 我是SB! ! !

#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>

const int N = 100005;

std::vector<int> G[N];
std::priority_queue<int> Q;

int dgr[N], ans[N], cnt;

int read() {
    int x = 0; char c = getchar();
    while (c < '0' || c > '9') c = getchar();
    while (c >= '0' && c <= '9') {
        x = (x << 3) + (x << 1) + (c ^ 48);
        c = getchar();
    }
    return x;
}

int main() {
    int T = read();
    while (T--) {
        int n = read(), m = read(); cnt = 0;
        memset(dgr, 0, sizeof dgr);
        for (int i = 1; i <= n; ++i) G[i].clear();
        for (int i = 1; i <= m; ++i) {
            int x = read(), y = read();
            G[y].push_back(x), ++dgr[x];
        }
        for (int i = 1; i <= n; ++i)
            if (dgr[i] == 0) Q.push(i);
        while (!Q.empty()) {
            int u = Q.top(); Q.pop();
            int sz = G[u].size();
            for (int i = 0; i < sz; ++i) {
                int v = G[u][i];
                if (--dgr[v] == 0) Q.push(v);
            }
            ans[++cnt] = u;
        }
        if (cnt < n) puts("Impossible!");
        else {
            for (int i = n; i >= 1; --i) printf("%d ", ans[i]);
            puts("");
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Milkyyyyy/article/details/81383711
今日推荐