Advertisement
minimario

<Dinac> TEMPLATE

Jan 25th, 2016
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.77 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ll long long
  5. #define mp make_pair
  6. #define pb push_back
  7. #define pii pair <int, int>
  8. #define piii pair<pii, int>
  9. #define vi vector<int>
  10. #define vpii vector<pii>
  11.  
  12. #define read1(a) int a; scanf("%d", &a)
  13. #define read2(a, b) int a, b; scanf("%d %d", &a, &b)
  14. #define read3(a, b, c) int a, b, c; scanf("%d %d %d", &a, &b, &c)
  15.  
  16. #define FOR(i, a, b) for (int i=a; i<b; i++)
  17. #define F0R(i, a) for (int i=0; i<a; i++)
  18.  
  19. #define readgi(n) F0R(i, n) { scanf("%d", &arr[i]); }
  20. #define readgs(n) F0R(i, n) { scanf(" %c", &arr[i]); }
  21.  
  22. #define f first
  23. #define s second
  24.  
  25. #define usaco(in, out) freopen(in, "r", stdin); freopen(out, "w", stdout);
  26.  
  27. #define println1(a) printf("%d\n", a);
  28. #define println2(a, b) printf("%d %d\n", a, b);
  29. #define println3(a, b, c) printf("%d %d %d\n", a, b, c);
  30. #define pv(v) for (int i : v) { printf("%d ", i); } printf("\n");
  31.  
  32. const int MOD = 1000000007;
  33. const int MAX = 205;
  34.  
  35. int arr[MAX];
  36.  
  37. ll source = 1, sink = 1, inf = (ll)1e15;
  38. ll n,m;
  39. ll c[MAX][MAX];
  40. vector<int> adj[MAX];
  41. void gen(){
  42.     F0R(i, MAX) { F0R(j, MAX) { c[i][j] = 0; adj[i].clear(); } }
  43.     for(ll i = 0; i < m; ++i){
  44.         ll a,b,cap;
  45.         cin >> a >> b >> cap;
  46.         if(a!=b){
  47.             /* **************** */
  48.             /* MODIFY THIS PART */
  49.             /* **************** */
  50.             adj[a].push_back(b);
  51.             adj[b].push_back(a);
  52.             c[a][b]+=cap;
  53.         }
  54.     }
  55.     for(ll i = 0; i < MAX; ++i){
  56.         sort(adj[i].begin(),adj[i].end());
  57.         adj[i].resize(unique(adj[i].begin(),adj[i].end())-adj[i].begin());
  58.     }
  59. }
  60. int visited[MAX];
  61. int lvl[MAX];
  62. int now[MAX];
  63.  
  64. bool dinic_bfs(){
  65.     vector<ll> bfs;
  66.     bfs.push_back(source);
  67.     lvl[source]=1;
  68.     for(int i = 0; i < bfs.size(); ++i){
  69.         ll pos = bfs[i];
  70.         for(ll j = 0; j < adj[pos].size(); ++j){
  71.             ll nxt = adj[pos][j];
  72.             if(lvl[nxt]==0&&c[pos][nxt]>0){
  73.                 bfs.push_back(nxt);
  74.                 lvl[nxt]=lvl[pos]+1;
  75.             }
  76.         }
  77.     }
  78.     return lvl[sink]!=0;
  79. }
  80. ll dinic_dfs(ll pos, ll flow){
  81.     visited[pos]=true;
  82.     if(pos==sink)
  83.         return flow;
  84.     while(now[pos]<adj[pos].size()){
  85.         ll nxt = adj[pos][now[pos]];
  86.         if(!visited[nxt]&&(lvl[pos]+1==lvl[nxt])&&c[pos][nxt]>0){
  87.             ll path = dinic_dfs(nxt,min(flow,c[pos][nxt]));
  88.             if(path>0){
  89.                 c[pos][nxt]-=path;
  90.                 c[nxt][pos]+=path;
  91.                 return path;
  92.             }
  93.         }
  94.         now[pos]++;
  95.     }
  96.     return 0;
  97. }
  98. ll dinic(){
  99.     ll ans = 0;
  100.     F0R(i, MAX) { now[i] = 0; lvl[i] = 0; visited[i] = 0; }
  101.     while(true){
  102.         for(int i = 0; i < MAX; ++i)
  103.             now[i]=0,lvl[i]=0;
  104.         if(dinic_bfs()){
  105.             while(true){
  106.                 for(int i = 0; i < MAX; ++i)
  107.                     visited[i]=0;
  108.                 ll cur = dinic_dfs(source,inf);
  109.                 if(cur==0)
  110.                     break;
  111.                 ans+=cur;
  112.             }
  113.         }
  114.         else
  115.             return ans;
  116.     }
  117. }
  118. int main(){
  119.     usaco("ditch.in", "ditch.out");
  120.     cin >> m >> n;
  121.     sink = n;
  122.     gen();
  123.     cout << dinic() << '\n';
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement