Advertisement
double_trouble

хз

Mar 2nd, 2016
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.46 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <vector>
  5. #include <cmath>
  6. #include <string>
  7. #include <algorithm>
  8. #include <string>
  9. #include <deque>
  10. #include <iomanip>
  11. #include <cstddef>
  12.  
  13.  
  14. using namespace std;
  15.  
  16. struct edge
  17. {
  18.     int cap, from, to, f;
  19.  
  20. };
  21.  
  22. const long double eps = 0.000000005;
  23. const long double pi = 3.1415926535897932;
  24. const long long inf = 1e9;
  25.  
  26. vector <edge> E;
  27. vector <vector<int> > g;
  28.  
  29. int c[10000], r[10000], a[1000][1000], p[10000];
  30. bool used[10000];
  31.  
  32. int S, I;
  33.  
  34. void add_edge(int cap, int from, int to)
  35. {
  36.     edge e;
  37.     e.cap = cap;
  38.     e.to = to;
  39.     e.from = from;
  40.     e.f = 0;
  41.     g[from].push_back(E.size());
  42.     E.push_back(e);
  43. }
  44.  
  45. void dfs(int v)
  46. {
  47.     if (v == S)
  48.         return;
  49.     used[v] = 1;
  50.     for (int i = 0; i < g[v].size(); i++)
  51.     {
  52.         int r = g[v][i];
  53.         int to = E[r].to;
  54.         if (!used[to] && E[r].cap > E[r].f)
  55.         {
  56.             p[to] = r;
  57.             dfs(to);
  58.         }
  59.     }
  60. }
  61.  
  62. int main()
  63. {
  64.     ios_base::sync_with_stdio(0);
  65.     freopen("input.txt", "r", stdin);//freopen("output.txt", "w", stdout);
  66.     // freopen("slalom.in", "r", stdin);freopen("slalom.out", "w", stdout);
  67.  
  68.     int n, m;
  69.     cin >> n >> m;
  70.  
  71.     I = 0;
  72.     S = n + m + 1;
  73.  
  74.     g.resize(S + 1);
  75.  
  76.  
  77.     for (int i = 0; i < n; i++)
  78.         cin >> r[i];
  79.  
  80.     for (int i = 0; i < m; i++)
  81.         cin >> c[i];
  82.  
  83.     int x;
  84.  
  85.     int ans = 0;
  86.     for (int i = 0; i < n; i++)
  87.         for (int j = 0; j < m; j++)
  88.         {
  89.             cin >> x;
  90.             a[i][j] = x;
  91.             if (x != -1)
  92.             {
  93.                 ans  += x;
  94.                 r[i] -= x;
  95.                 c[j] -= x;
  96.             }
  97.         }
  98.  
  99.  
  100.     for (int i = 0; i < n; i++)
  101.     {
  102.         add_edge(r[i], I, i + 1);
  103.         add_edge(0, i + 1, I);
  104.     }
  105.  
  106.     for (int i = 0; i < n; i++)
  107.         for (int j = 0; j < m; j++)
  108.             if (a[i][j] == -1)
  109.         {
  110.             add_edge(inf, i + 1, n + j + 1);
  111.             add_edge(0, n + j + 1, i + 1);
  112.         }
  113.  
  114.  
  115.     for (int i = 0; i < m; i++)
  116.     {
  117.         add_edge(c[i], i + 1 + n, S);
  118.         add_edge(0, S, i + n + 1);
  119.     }
  120.    
  121.  
  122.     while (1)
  123.     {
  124.         for (int i = 0; i <= S; i++)
  125.         {
  126.             p[i] = -1;
  127.             used[i] = 0;
  128.         }
  129.  
  130.         dfs(0);
  131.         if (p[S] == -1)
  132.             break;
  133.  
  134.         int f = 100000000;
  135.         for (int i = S; i != I; i = E[p[i]].from)
  136.         {
  137.             int r = p[i];
  138.             f = min(f, E[r].cap - E[r].f);
  139.         }
  140.  
  141.         for (int i = S; i != I; i = E[p[i]].from)
  142.         {
  143.             int r = p[i];
  144.             E[r].f += f;
  145.             E[r ^ 1].f -= f;
  146.         }
  147.     }
  148.  
  149.     for (int i = 1; i <= n; i++)
  150.         for (int j = 0; j < g[i].size(); j++)
  151.         {
  152.             if (E[g[i][j]].to >= n + 1 && E[g[i][j]].to <= n + m)
  153.             {
  154.                 int r = g[i][j];
  155.                 ans += E[r].f;
  156.             }
  157.         }
  158.  
  159.     cout << ans << endl;
  160.  
  161.     return 0;
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement