Advertisement
anechka_ne_plach

Hopefully useful

Oct 8th, 2021
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.45 KB | None | 0 0
  1. #pragma optimize("O3")
  2. #include <iostream>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <random>
  6. #include <cstring>
  7. using namespace std;
  8.  
  9. const int N = 2000 + 7;
  10.  
  11. int n, m, k;
  12. vector<int> g[N];
  13. int order[N];
  14.  
  15. int cover[N];
  16. int k_curr = 0;
  17. int visited[N];
  18. int cover_curr[N];
  19.  
  20. vector<int> g_red[N];
  21.  
  22. void check() {
  23.     int k_copy = k_curr;
  24.     memcpy(cover_curr, cover, sizeof(cover));
  25.     memset(visited, 0, sizeof(visited));
  26.     for (int i = 0; i < n; ++i) {
  27.         g_red[i].clear();
  28.         if (!cover_curr[i]) {
  29.             for (int j : g[i]) {
  30.                 if (!cover_curr[j]) {
  31.                     g_red[i].push_back(j);
  32.                 }
  33.             }
  34.         }
  35.     }
  36.     for (int t = 0; t < 2; ++t) {
  37.         for (int i = 0; i < n; ++i) {
  38.             if (!visited[i] && g_red[i].size() == t + 1) {
  39.                 int cur = i;
  40.                 int step = t;
  41.                 while (!visited[cur]) {
  42.                     visited[cur] = true;
  43.                     if (step & 1) {
  44.                         cover_curr[cur] = true;
  45.                         ++k_copy;
  46.                         if (k_copy > k) {
  47.                             return;
  48.                         }
  49.                     }
  50.                     step++;
  51.                     for (int j: g_red[cur]) {
  52.                         if (j != cur) {
  53.                             cur = j;
  54.                             break;
  55.                         }
  56.                     }
  57.                 }
  58.             }
  59.         }
  60.     }
  61. //    for (int i = 0; i < n; ++i) {
  62. //        g_red[i].clear();
  63. //        if (!cover[i]) {
  64. //            for (int j : g[i]) {
  65. //                if (!cover[j]) {
  66. //                    if (i < j) {
  67. //                        cout << i + 1 << " " << j + 1 << "\n";
  68. //                    }
  69. //                }
  70. //            }
  71. //        }
  72. //    }
  73.     cout << "Yes\n";
  74.     for (int i = 0; i < n; ++i) {
  75.         if (cover_curr[i]) {
  76.             cout << i + 1 << " ";
  77.         } else if (k_copy < k) {
  78.             cout << i + 1 << " ";
  79.             ++k_copy;
  80.         }
  81.     }
  82.     exit(0);
  83. }
  84.  
  85. void req(int i) {
  86.     if (i == n) {
  87.         check();
  88.         return;
  89.     }
  90.     int v = order[i];
  91.     if (!cover[v]) {
  92.         int power = 0;
  93.         for (int u : g[v]) {
  94.             if (!cover[u]) {
  95.                 ++power;
  96.                 if (power > 2) {
  97.                     break;
  98.                 }
  99.             }
  100.         }
  101.         if (power > 2) {
  102.             cover[v]++;
  103.             ++k_curr;
  104.             if (k_curr <= k) {
  105.                 req(i + 1);
  106.             }
  107.             --k_curr;
  108.             cover[v]--;
  109.  
  110.             for (int u: g[v]) {
  111.                 k_curr += (cover[u] == 0);
  112.                 ++cover[u];
  113.             }
  114.             if (k_curr <= k) {
  115.                 req(i + 1);
  116.             }
  117.             for (int u: g[v]) {
  118.                 --cover[u];
  119.                 k_curr -= (cover[u] == 0);
  120.             }
  121.             return;
  122.         }
  123.     }
  124.     req(i + 1);
  125. }
  126.  
  127. int main() {
  128.     ios::sync_with_stdio(0);
  129.     cin.tie(0), cout.tie(0);
  130.     cin >> n >> m >> k;
  131.     for (int i = 0; i < n; ++i) {
  132.         order[i] = i;
  133.     }
  134.     for (int i = 0; i < m; ++i) {
  135.         int v, u;
  136.         cin >> v >> u;
  137.         --v, --u;
  138.         g[v].push_back(u);
  139.         g[u].push_back(v);
  140.     }
  141.     std::random_device rd;
  142.     std::mt19937 r(rd());
  143.  
  144.     std::shuffle(order, order + n, r);
  145.     req(0);
  146.     cout << "No\n";
  147.     return 0;
  148. }
  149.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement