mr_dot_convict

10779-Collectors-Problem-UVa-mr.convict

May 21st, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.50 KB | None | 0 0
  1. /*author* Priyanshu Shrivastav (from IIT Palakkad) *
  2.  * *_ __ ___  _ ______ ___  _ ____   ___  ___| |_  *
  3.  * | '_ ` _ \| '__/ __/ _ \| '_ \ \ / / |/ __| __| *
  4.  * | | | | | | | | (_| (_) | | | \ V /| | (__| |_  *
  5.  * |_| |_| |_|_|(_)___\___/|_| |_|\_/ |_|\___|\__| *
  6. When I wrote this, only God and I understood what I was doing
  7.  ** * * * * * * * Now, only God knows * * * * * * */
  8. //TODO with less vertices merge all mm * i + j in one for each i, i.e. merge j vertex to one for each player except bob
  9. #include         <bits/stdc++.h>
  10. #pragma GCC      optimize ("Ofast")
  11. #pragma GCC      optimize ("unroll-loops")
  12. #pragma GCC      target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  13.  
  14. #define IOS      ios_base::sync_with_stdio(false); cin.tie (nullptr)
  15. #define PREC     cout.precision (10); cout << fixed
  16. #define bg(x)    "[ " << #x << " : " << x << " ]"
  17. #define x        first
  18. #define y        second
  19. using namespace std;
  20. using pii = pair <int, int>;
  21.  
  22. const int N = 10 * 25 + 2;
  23. const int infi = (int)1e9;
  24.  
  25. int f[N][N];
  26. vector < vector <int> > Adj;
  27. int n, m, nn, mm;
  28. int Par[N];
  29.  
  30. int bfs (int s, int t) {
  31.    fill (Par, Par + n, -1);
  32.    Par[s] = -2;
  33.  
  34.    queue <pii> Q;
  35.    Q.push(pii(s, infi));
  36.  
  37.    while (!Q.empty()) {
  38.       pii tmp = Q.front();
  39.       Q.pop();
  40.       int u = tmp.x, flow = tmp.y;
  41.  
  42.       for (int v : Adj[u]) {
  43.          if (Par[v] == -1 && f[u][v]) {
  44.             Par[v] = u;
  45.             int newFlow = min(flow, f[u][v]);
  46.             if (v == t) {
  47.                return newFlow;
  48.             }
  49.             Q.push(pii(v, newFlow));
  50.          }
  51.       }
  52.    }
  53.    return 0;
  54. }
  55.  
  56. int edmondsKarp(int s, int t) {
  57.    int flow = 0;
  58.    int newFlow;
  59.  
  60.    while ((newFlow = bfs (s, t))) {
  61.       flow += newFlow;
  62.       int cur = t;
  63.       while (cur != s) {
  64.          int prv = Par[cur];
  65.          f[prv][cur] -= newFlow;
  66.          f[cur][prv] += newFlow;
  67.          cur = prv;
  68.       }
  69.    }
  70.    return flow;
  71. }
  72.  
  73. void solve(int tc) {
  74.    int s, t;
  75.    for (int i = 0; i < N; ++i)
  76.       for (int j = 0; j < N; ++j)
  77.          f[i][j] = 0;
  78.  
  79.    cin >> nn >> mm;
  80.    n = nn * mm + 2;
  81.    s = nn * mm, t = nn * mm + 1;
  82.    Adj.assign(n, vector <int> ());
  83.  
  84.    int val[25];
  85.    for (int i = 0; i < nn; ++i) {
  86.       fill (val, val + 25, 0);
  87.       int ki, kval;
  88.       cin >> ki;
  89.       while (ki--) {
  90.          cin >> kval;
  91.          --kval;
  92.          val[kval] += 1;
  93.       }
  94.       for (int j = 0; j < mm; ++j) {
  95.          int w = val[j];
  96.          if (i == 0) {
  97.             Adj[j].push_back(s);
  98.             Adj[s].push_back(j);
  99.             f[s][j] = w;
  100.  
  101.             Adj[j].push_back(t);
  102.             Adj[t].push_back(j);
  103.             f[j][t] = 1;
  104.          }
  105.          else {
  106.             w -= 1;
  107.             Adj[mm * i + j].push_back(j);
  108.             Adj[j].push_back(mm * i + j);
  109.             if (w > 0)
  110.                f[mm * i + j][j] = w;
  111.             else if (w < 0) {
  112.                f[j][mm * i + j] = -w;
  113.             }
  114.          }
  115.       }
  116.  
  117.       if (i) {
  118.          for (int j = 0; j < mm; ++j) {
  119.             for (int k = j + 1; k < mm; ++k) {
  120.                Adj[mm * i + j].push_back(mm * i + k);
  121.                Adj[mm * i + k].push_back(mm * i + j);
  122.                f[mm * i + j][mm * i + k] = 1;
  123.                f[mm * i + k][mm * i + j] = 1;
  124.             }
  125.          }
  126.       }
  127.    }
  128.    cout << "Case #" << tc << ": " << edmondsKarp(s, t) << '\n';;
  129. }
  130.  
  131. signed main() {
  132.    int tc;
  133.    cin >> tc;
  134.    for (int i = 1; i <= tc; ++i) {
  135.       solve(i);
  136.    }
  137.  
  138.    return EXIT_SUCCESS;
  139. }
Add Comment
Please, Sign In to add comment