Advertisement
Guest User

Untitled

a guest
Feb 26th, 2020
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.41 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n, m, k, ct;
  4. bool br[35][35];
  5. int st, fin;
  6. bool viss[35];
  7. vector <int> spec[12];
  8. int vis[500], timer = 0, level[500], ptr[500];
  9. queue <int> q;
  10. struct dat { int from, to, capa, flow; };
  11. vector <dat> E;
  12. vector <int> a[500];
  13. void addedge(int u, int v, int wei)
  14. {
  15.     E.push_back({u, v, wei, 0});
  16.     E.push_back({v, u, 0, 0});
  17.     int x1 = E.size() - 2, x2 = E.size() - 1;
  18.     a[u].push_back(x1);
  19.     a[v].push_back(x2);
  20. }
  21. void Edge(int mid)
  22. {
  23.     for (int i = 1; i <= m; ++i)
  24.     {
  25.         addedge(0, i, mid);
  26.     }
  27.     for (int i = 1; i <= m; ++i)
  28.     {
  29.         memset(viss, 0, sizeof(viss));
  30.         for (int j = 0; j < spec[i].size(); ++j)
  31.         {
  32.             for (int t = j + 1; t < spec[i].size(); ++t)
  33.             {
  34.                 int u = spec[i][j], v = spec[i][t];
  35.                 if (!br[u][v]) continue;
  36.                 ct++;
  37.                 addedge(i,  ct + m + n, 1);
  38.                 addedge(ct + m + n, m + u, 1);
  39.                 addedge(ct + m + n, m + v, 1);
  40.                 viss[u] = viss[v] = true;
  41.             }
  42.         }
  43.         for (int u : spec[i])
  44.         {
  45.             if (viss[u]) continue;
  46.             addedge(i, m + u, 1);
  47.         }
  48.     }
  49.     fin = m + n + ct + 1;
  50.     for (int i = 1; i <= n; ++i)
  51.     {
  52.         addedge(m + i, fin, 1);
  53.     }
  54. }
  55. bool bfs()
  56. {
  57.     level[st] = 0; vis[st] = ++timer; q.push(st);
  58.     for (int i = 0; i <= fin; ++i) ptr[i] = 0;
  59.     while (!q.empty())
  60.     {
  61.         int u = q.front(); q.pop();
  62.         for (int id : a[u])
  63.         {
  64.             int v = E[id].to;
  65.             if (E[id].capa - E[id].flow < 1 || vis[v] == timer) continue;
  66.             level[v] = level[u] + 1;
  67.             vis[v] = timer;
  68.             q.push(v);
  69.         }
  70.     }
  71.     return vis[fin] == timer;
  72. }
  73. int dfs(int u, int pushed)
  74. {
  75.     if (pushed == 0) return 0;
  76.     if (u == fin) return pushed;
  77.     for (int &cid = ptr[u]; cid < (int)a[u].size(); ++cid)
  78.     {
  79.         int id = a[u][cid];
  80.         int v = E[id].to;
  81.         if (level[u] + 1 != level[v] || E[id].capa - E[id].flow < 1) continue;
  82.         int tr = dfs(v, min(pushed, E[id].capa - E[id].flow));
  83.         if (tr == 0) continue;
  84.         E[id].flow += tr;
  85.         E[id ^ 1].flow -= tr;
  86.         return tr;
  87.     }
  88.     return 0;
  89. }
  90. bool Check(int mid)
  91. {
  92.     E.clear();
  93.     ct = 0;
  94.     for (int i = 0; i < 500; ++i)
  95.     {
  96.         level[i] = 0;
  97.         vis[i] = 0;
  98.         if (a[i].empty()) break;
  99.         a[i].clear();
  100.     }
  101.     timer = 0;
  102.     Edge(mid);
  103.     int f = 0;
  104.     while (bfs())
  105.     {
  106.         while (int pushed = dfs(st, 2e9)) { f += pushed; }
  107.     }
  108.     return (f == n);
  109. }
  110. void solve()
  111. {
  112.     int l = (n + m - 1) / m, r = m, ans = -1;
  113.     while (l <= r)
  114.     {
  115.         int mid = (l + r) / 2;
  116.         if (Check(mid))
  117.         {
  118.             r = mid - 1;
  119.             ans = mid;
  120.         }
  121.         else l = mid + 1;
  122.     }
  123.     cout << ans;
  124. }
  125. int main()
  126. {
  127.     ios::sync_with_stdio(0);
  128.     cin.tie(0);
  129.     if (fopen("input.txt", "r"))
  130.         assert(freopen("input.txt", "r", stdin));
  131.     cin >> m >> n;
  132.     for (int i = 1; i <= m; ++i)
  133.     {
  134.         int x; cin >> x;
  135.         while (x--)
  136.         {
  137.             int u; cin >> u;
  138.             spec[i].push_back(u);
  139.         }
  140.     }
  141.     cin >> k;
  142.     for (int i = 1; i <= k; ++i)
  143.     {
  144.         int u, v;
  145.         cin >> u >> v;
  146.         br[u][v] = br[v][u] = 1;
  147.     }
  148.     solve();
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement