Codeforces Round #652 (Div. 2) E. DeadLee(贪心)

题目链接:https://codeforces.com/contest/1369/problem/E

题意

Lee 有 $n$ 种不同种类的食物和 $m$ 个朋友,每种食物有 $w_i$ 个,每个朋友喜欢吃两种食物 $x_i, y_i$,如果一个朋友被叫去厨房时一个喜欢吃的食物也没有,他就会吃掉 Lee,否则对还有的他喜欢吃的食物一种吃掉一个,问是否存在一个叫朋友去厨房的顺序保证 Lee 不会被吃掉。

题解

设 $s_i$ 为第 $i$ 种食物共需要多少个,若 $w_i \ge s_i$,则喜欢第 $i$ 种食物的朋友一定不会吃 Lee,最优起见,可以最后再叫他们,同时他们喜欢的另一种食物也可以省下来了。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, m; cin >> n >> m;
    int w[n] = {};
    for (int i = 0; i < n; i++)
        cin >> w[i];
    vector<pair<int, int>> e[n];
    int s[n] = {};
    for (int i = 0; i < m; i++) {
        int u, v; cin >> u >> v;
        --u, --v;
        e[u].emplace_back(v, i);
        e[v].emplace_back(u, i);
        ++s[u], ++s[v];
    }
    queue<int> que;
    for (int i = 0; i < n; i++)
        if (w[i] >= s[i])
            que.push(i);
    vector<int> ans;
    bool vis[m] = {};
    while (!que.empty()) {
        int u = que.front();
        que.pop(); 
        for (auto [v, i] : e[u]) {
            if (vis[i])
                continue;
            vis[i] = 1;
            ans.push_back(i);
            if (--s[v] == w[v])
                que.push(v);
        }
    }
    if (int(ans.size()) < m) {
        cout << "DEAD" << "\n";
        return 0;
    }
    cout << "ALIVE" << "\n";
    reverse(ans.begin(), ans.end());
    for (int i = 0; i < m; i++)
        cout << ans[i] + 1 << " \n"[i == m - 1];
}

 

posted @ 2020-06-24 20:45  Kanoon  阅读(298)  评论(0编辑  收藏  举报