Advertisement
double_trouble

potok

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