| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- #include <iostream>
- #include <queue>
- #include <vector>
- using namespace std;
- int main() {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- int n, m, need1, need2, need3;
- cin >> n >> m >> need1 >> need2 >> need3;
- vector<vector<int>> g(n);
- while (m--) { int u, v; cin >> u >> v; --u; --v; g[u].push_back(v); g[v].push_back(u); }
- vector<int> color(n, -1), component(n, -1);
- vector<vector<int>> side0, side1;
- for (int start = 0; start < n; ++start) if (color[start] == -1) {
- int id = side0.size(); side0.push_back({}); side1.push_back({});
- queue<int> q; q.push(start); color[start] = 0; component[start] = id;
- while (!q.empty()) {
- int u = q.front(); q.pop();
- (color[u] == 0 ? side0[id] : side1[id]).push_back(u);
- for (int v : g[u]) {
- if (color[v] == -1) color[v] = color[u] ^ 1, component[v] = id, q.push(v);
- else if (color[v] == color[u]) { cout << "NO\n"; return 0; }
- }
- }
- }
- int count = side0.size();
- vector<vector<signed char>> choice(count + 1, vector<signed char>(need2 + 1, -1));
- choice[0][0] = 0;
- for (int i = 0; i < count; ++i) for (int sum = 0; sum <= need2; ++sum) if (choice[i][sum] != -1) {
- if (sum + static_cast<int>(side0[i].size()) <= need2)
- choice[i + 1][sum + side0[i].size()] = 0;
- if (sum + static_cast<int>(side1[i].size()) <= need2)
- choice[i + 1][sum + side1[i].size()] = 1;
- }
- if (choice[count][need2] == -1) { cout << "NO\n"; return 0; }
- vector<int> selected(count); int sum = need2;
- for (int i = count; i > 0; --i) {
- selected[i - 1] = choice[i][sum];
- sum -= selected[i - 1] == 0 ? side0[i - 1].size() : side1[i - 1].size();
- }
- vector<char> answer(n, '3');
- for (int i = 0; i < count; ++i) {
- const vector<int> &middle = selected[i] == 0 ? side0[i] : side1[i];
- for (int v : middle) answer[v] = '2';
- }
- for (int v = 0; v < n && need1 > 0; ++v) if (answer[v] != '2') answer[v] = '1', --need1;
- cout << "YES\n";
- for (char c : answer) cout << c;
- cout << '\n';
- }
|