题目链接: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" << " "; return 0; } cout << "ALIVE" << " "; reverse(ans.begin(), ans.end()); for (int i = 0; i < m; i++) cout << ans[i] + 1 << " "[i == m - 1]; }