Advertisement
Guest User

Kubuś

a guest
Jun 23rd, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.85 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <bitset>
  4.  
  5. const int N = 21;
  6. const int STANY = 2097152;
  7. std::vector<int> tab[N];
  8. int liczba_krawedzi[STANY];
  9. int dp_max[STANY];
  10. int n;
  11. int dwadoentej = 1;
  12. std::bitset<N> akt;
  13. std::bitset<N> poprzedni;
  14. char input[N];
  15.  
  16. int wynikStanu(int stan, int pop, int id_rozn) {
  17.     akt = stan;
  18.     poprzedni = pop;
  19.     int kol_sasiedzi = 0;
  20.     for (auto it : tab[n - id_rozn]) {
  21.         if (poprzedni[n - it])
  22.             kol_sasiedzi++;
  23.     }
  24.     return liczba_krawedzi[pop] + (int) tab[n - id_rozn].size() - 2 * kol_sasiedzi;
  25. }
  26.  
  27. void obliczKraw() {
  28.     int potega = 1;
  29.     int id_rozn = 0;
  30.     for (int i = 1; i <= n; i++)
  31.         dwadoentej *= 2;
  32.     for (int i = 1; i < dwadoentej; i++) {
  33.         if (potega * 2 <= i) {
  34.             potega *= 2;
  35.             id_rozn++;
  36.         }
  37.         liczba_krawedzi[i] = wynikStanu(i, i ^ potega, id_rozn);
  38.     }
  39. }
  40.  
  41. void obliczDp() {
  42.     for (int i = 1; i < dwadoentej; i++) {
  43.         int max = liczba_krawedzi[i];
  44.         akt = i;
  45.         for (int j = 0; j < n; j++) {
  46.             if (akt[j]) {
  47.                 akt[j] = false;
  48.                 max = std::max(max, dp_max[(int) akt.to_ulong()]);
  49.                 akt[j] = true;
  50.             }
  51.         }
  52.         dp_max[i] = max;
  53.     }
  54. }
  55.  
  56. int binToDec() {
  57.     int ret = 0;
  58.     int pot = 1;
  59.     for (int i = n - 1; i >= 0; i--) {
  60.         if (input[i] == '1')
  61.             ret += pot;
  62.         pot *= 2;
  63.     }
  64.     return ret;
  65. }
  66.  
  67. int main() {
  68.     int m, q, a, b;
  69.     scanf("%d%d%d", &n, &m, &q);
  70.     for (int i = 0; i < m; i++) {
  71.         scanf("%d%d", &a, &b);
  72.         tab[a].push_back(b);
  73.         tab[b].push_back(a);
  74.     }
  75.     obliczKraw();
  76.     obliczDp();
  77.     int x;
  78.     while (q--) {
  79.         scanf("%s", input);
  80.         x = binToDec();
  81.         printf("%d\n", dp_max[x]);
  82.     }
  83.     return 0;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement