Advertisement
PikMike

Untitled

Jan 3rd, 2017
498
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.74 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define pb push_back
  4. #define mp make_pair
  5. #define sz(x) (int)(x).size()
  6. #define li long long
  7. #define ld long double
  8. #define x first
  9. #define y second
  10. #define pt pair<int, int>
  11. #define pll pair<ll, ll>
  12. #define forn(i, t) for(int i = 0; i < (t); i++)
  13. #define fore(i, f, t) for(int i = (f); i < (t); i++)
  14. #define forr(i, f, t) for(int i = (f) - 1; i >= (t); i--)
  15. #define all(x) (x).begin(), (x).end()
  16. #define ins insert
  17.  
  18. using namespace std;
  19.  
  20.  
  21. const int INF = 1e9;
  22. const int MOD = 1000000007;
  23. const li INF64 = 1e18;
  24. const ld EPS = 1e-7;
  25.  
  26. mt19937 myrand(time(NULL));
  27.  
  28. const int N = 213;
  29.  
  30. int n;
  31. int d[N][N], f[N][N], p[N];
  32. bool used[N];
  33.  
  34.  
  35. bool read(){
  36.     if(scanf("%d", &n) != 1)
  37.         return 0;
  38.     forn(i, n)
  39.         forn(j, n)
  40.             scanf("%d", &d[i][j]);
  41.     return 1;
  42. }
  43.  
  44.  
  45. int bfs(){
  46.     queue<int> q;
  47.     q.push(0);
  48.     used[0] = 1;
  49.     int dt = INF;
  50.     bool fl;
  51.    
  52.     while (!q.empty()){
  53.         int v = q.front();
  54.         q.pop();
  55.         fl = 0;
  56.         forn(u, n)
  57.             if (!used[u] && f[v][u] < d[v][u]){
  58.                 used[u] = 1;
  59.                 p[u] = v;
  60.                 q.push(u);
  61.                 if (u == n - 1){
  62.                     fl = 1;
  63.                     break;             
  64.                 }
  65.             }
  66.         if (fl)
  67.             break;
  68.     }
  69.    
  70.     if (q.empty())
  71.         return 0;
  72.    
  73.     int cur;
  74.     cur = n - 1;
  75.     while (cur != 0){
  76.         dt = min(dt, d[p[cur]][cur] - f[p[cur]][cur]);
  77.         cur = p[cur];
  78.     }
  79.    
  80.     cur = n - 1;
  81.     while (cur != 0){
  82.         f[p[cur]][cur] += dt;
  83.         f[cur][p[cur]] -= dt;
  84.         cur = p[cur];
  85.     }
  86.    
  87.     return dt;
  88. }
  89.  
  90.  
  91. void solve(){
  92.     int res;
  93.     memset(f, 0, sizeof(f));
  94.    
  95.     do{
  96.         memset(used, 0, sizeof(used));
  97.         res = bfs();
  98.     } while(res > 0);
  99.    
  100.     li sum = 0;
  101.     forn(i, n)
  102.         sum += f[0][i];
  103.     printf("%lld\n", sum);
  104. }
  105.  
  106.  
  107. int main(){
  108.     #ifdef _DEBUG
  109.         freopen("input.txt", "r", stdin);
  110.     #endif
  111.     while(read())
  112.         solve();
  113.     return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement