1
0

CodeForces-1354E.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #include <iostream>
  2. #include <queue>
  3. #include <vector>
  4. using namespace std;
  5. int main() {
  6. ios::sync_with_stdio(false);
  7. cin.tie(nullptr);
  8. int n, m, need1, need2, need3;
  9. cin >> n >> m >> need1 >> need2 >> need3;
  10. vector<vector<int>> g(n);
  11. while (m--) { int u, v; cin >> u >> v; --u; --v; g[u].push_back(v); g[v].push_back(u); }
  12. vector<int> color(n, -1), component(n, -1);
  13. vector<vector<int>> side0, side1;
  14. for (int start = 0; start < n; ++start) if (color[start] == -1) {
  15. int id = side0.size(); side0.push_back({}); side1.push_back({});
  16. queue<int> q; q.push(start); color[start] = 0; component[start] = id;
  17. while (!q.empty()) {
  18. int u = q.front(); q.pop();
  19. (color[u] == 0 ? side0[id] : side1[id]).push_back(u);
  20. for (int v : g[u]) {
  21. if (color[v] == -1) color[v] = color[u] ^ 1, component[v] = id, q.push(v);
  22. else if (color[v] == color[u]) { cout << "NO\n"; return 0; }
  23. }
  24. }
  25. }
  26. int count = side0.size();
  27. vector<vector<signed char>> choice(count + 1, vector<signed char>(need2 + 1, -1));
  28. choice[0][0] = 0;
  29. for (int i = 0; i < count; ++i) for (int sum = 0; sum <= need2; ++sum) if (choice[i][sum] != -1) {
  30. if (sum + static_cast<int>(side0[i].size()) <= need2)
  31. choice[i + 1][sum + side0[i].size()] = 0;
  32. if (sum + static_cast<int>(side1[i].size()) <= need2)
  33. choice[i + 1][sum + side1[i].size()] = 1;
  34. }
  35. if (choice[count][need2] == -1) { cout << "NO\n"; return 0; }
  36. vector<int> selected(count); int sum = need2;
  37. for (int i = count; i > 0; --i) {
  38. selected[i - 1] = choice[i][sum];
  39. sum -= selected[i - 1] == 0 ? side0[i - 1].size() : side1[i - 1].size();
  40. }
  41. vector<char> answer(n, '3');
  42. for (int i = 0; i < count; ++i) {
  43. const vector<int> &middle = selected[i] == 0 ? side0[i] : side1[i];
  44. for (int v : middle) answer[v] = '2';
  45. }
  46. for (int v = 0; v < n && need1 > 0; ++v) if (answer[v] != '2') answer[v] = '1', --need1;
  47. cout << "YES\n";
  48. for (char c : answer) cout << c;
  49. cout << '\n';
  50. }