Advertisement
Guest User

Untitled

a guest
Nov 14th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define sz(x) ((int) (x).size())
  6. #define forn(i,n) for (int i = 0; i < int(n); ++i)
  7. #define forab(i,a,b) for (int i = int(a); i < int(b); ++i)
  8.  
  9. typedef long long ll;
  10. typedef long double ld;
  11.  
  12. const int INF = 1000001000;
  13. const ll INFL = 2000000000000001000;
  14.  
  15. const int maxn = 500;
  16.  
  17. ll g[maxn][maxn];
  18. ll dist[maxn];
  19. bool used[maxn];
  20.  
  21. void addEdge(int u, int v, ll c)
  22. {
  23.     g[u][v] += c;
  24.     g[v][u] += c;
  25. }
  26.  
  27. int main()
  28. {
  29.     int n, m;
  30.     scanf("%d%d", &n, &m);
  31.     ll total = 0;
  32.     forn (i, m)
  33.     {
  34.         int k, f;
  35.         scanf("%d%d", &k, &f);
  36.         total += 2 * f;
  37.         vector<int> group;
  38.         forn (j, k)
  39.         {
  40.             int u;
  41.             scanf("%d", &u);
  42.             --u;
  43.             group.push_back(u);
  44.         }
  45.         if (k == 2)
  46.             addEdge(group[0], group[1], 2 * f);
  47.         else
  48.         {
  49.             addEdge(group[0], group[1], f);
  50.             addEdge(group[1], group[2], f);
  51.             addEdge(group[2], group[0], f);
  52.         }
  53.     }
  54.     vector<int> vertices;
  55.     forn (i, n)
  56.         vertices.push_back(i);
  57.     ll mincut = total + 1;
  58.     while (sz(vertices) > 1)
  59.     {
  60.         int u = vertices[0];
  61.         for (auto v: vertices)
  62.             used[v] = false,
  63.             dist[v] = g[u][v];
  64.         used[u] = true;
  65.         forn (ii, sz(vertices) - 2)
  66.         {
  67.             for (auto v: vertices)
  68.                 if (!used[v])
  69.                     if (used[u] || dist[v] > dist[u])
  70.                         u = v;
  71.             used[u] = true;
  72.             for (auto v: vertices)
  73.                 if (!used[v])
  74.                     dist[v] += g[u][v];
  75.         }
  76.         int t = -1;
  77.         for (auto v: vertices)
  78.             if (!used[v])
  79.                 t = v;
  80.         mincut = min(mincut, dist[t]);
  81.         vertices.erase(find(vertices.begin(), vertices.end(), t));
  82.         for (auto v: vertices)
  83.             addEdge(u, v, g[v][t]);
  84.     }
  85.  
  86.     cout << (total - mincut) / 2 << '\n';
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement