Advertisement
RaFiN_

Tanzir vai dinic

Jul 6th, 2020
832
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.77 KB | None | 0 0
  1. /*
  2. The Great Template of Salazar Slytherin
  3. */
  4. #include <bits/stdc++.h>
  5.  
  6. using namespace std;
  7.  
  8. #define rep(i,n) for(i=0; i<n; i++)
  9. #define repl(i,n) for(i=1; i<=n; i++)
  10.  
  11. #define sz(x) (int) x.size()
  12. #define pb  push_back
  13. #define all(x) x.begin(),x.end()
  14. #define uu first
  15. #define vv second
  16. #define mem(x, y) memset(x, y, sizeof(x));
  17.  
  18. #define sdi(x) scanf("%d", &x)
  19. #define sdii(x, y) scanf("%d %d", &x, &y)
  20. #define sdiii(x, y, z) scanf("%d %d %d", &x, &y, &z)
  21. #define sdl(x) scanf("%lld", &x)
  22. #define sdll(x, y) scanf("%lld %lld", &x, &y)
  23. #define sdlll(x, y, z) scanf("%lld %lld %lld", &x, &y, &z)
  24. #define sds(x) scanf("%s", x)
  25. #define pfi(x) printf("%d\n", x)
  26. #define pfii(x, y) printf("%d %d\n", x, y)
  27. #define pfiii(x, y, z) printf("%d %d %d\n", x, y, z)
  28. #define pfl(x) printf("%lld\n", x)
  29. #define pfll(x, y) printf("%lld %lld\n", x, y)
  30. #define pflll(x, y, z) printf("%lld %lld %lld\n", x, y, z)
  31.  
  32. #define eps 1e-13
  33. #define OK printf("ok\n")
  34. #define DB(x) cout << #x << " = " << x << endl;
  35.  
  36. /// Tanzir
  37. #define FRE(i,a,b)  for(i = a; i <= b; i++)
  38. #define FRL(i,a,b)  for(i = a; i < b; i++)
  39. #define un(x)       x.erase(unique(all(x)), x.end())
  40. #define sf(n)       scanf("%d", &n)
  41. #define sff(a,b)    scanf("%d %d", &a, &b)
  42. #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
  43. #define sl(n)       scanf("%lld", &n)
  44. #define sll(a,b)    scanf("%lld %lld", &a, &b)
  45. #define slll(a,b,c) scanf("%lld %lld %lld", &a, &b, &c)
  46. #define D(x)        cout<<#x " = "<<(x)<<endl
  47. #define DBG         printf("Hi\n")
  48. #define PI          acos(-1.00)
  49. #define xx          first
  50. #define yy          second
  51.  
  52. typedef double db;
  53. typedef long long LL;
  54. typedef unsigned long long ULL;
  55. typedef pair <int, int> pii;
  56. typedef pair <long long , long long > pll;
  57.  
  58. inline int setBit(int N, int pos) { return N=N | (1<<pos); }
  59. inline int resetBit(int N, int pos) { return N= N & ~(1<<pos); }
  60. inline bool checkBit(int N, int pos) { return (bool)(N & (1<<pos)); }
  61.  
  62. //int kx[] = {+2, +1, -1, -2, -2, -1, +1, +2};
  63. //int ky[] = {+1, +2, +2, +1, -1, -2, -2, -1}; //Knight Direction
  64. //int fx[] = {+0, +0, +1, -1, -1, +1, -1, +1};
  65. //int fy[] = {-1, +1, +0, +0, +1, +1, -1, -1}; //Four & Eight Direction
  66.  
  67. /// Zobayer vai's code
  68.  
  69. const int MAXN = 105, MAXE = 500+505; // MAXE = twice the number of edges
  70. int src, snk, nNode, nEdge;
  71. LL Q[MAXN], fin[MAXN], pro[MAXN], dist[MAXN];
  72. LL flow[MAXE], cap[MAXE], nxt[MAXE], to[MAXE];
  73. const LL inf = 1e9;
  74. inline void init(int _src, int _snk, int _n)
  75. {
  76.     src = _src, snk = _snk, nNode = _n, nEdge = 0;
  77.     mem(fin, -1);
  78. }
  79.  
  80. inline void add(int u, int v, LL _cap)
  81. {
  82. //    D(_cap);
  83.     to[nEdge] = v, cap[nEdge] = _cap, flow[nEdge] = 0, nxt[nEdge] = fin[u], fin[u] = nEdge++;
  84.     to[nEdge] = u, cap[nEdge] = 0, flow[nEdge] = 0, nxt[nEdge] = fin[v], fin[v] = nEdge++; // for directed cap[nEdge]=0 here
  85. }
  86.  
  87. bool bfs()
  88. {
  89.     int st, en, i, u, v;
  90.     mem(dist, -1);
  91.     dist[src] = st = en = 0;
  92.     Q[en++] = src;
  93.     while(st < en)
  94.     {
  95.         u = Q[st++];
  96.         for(i=fin[u]; i>=0; i=nxt[i])
  97.         {
  98.             v = to[i];
  99.             if(flow[i] < cap[i] && dist[v]==-1)
  100.             {
  101.                 dist[v] = dist[u]+1;
  102.                 Q[en++] = v;
  103.             }
  104.         }
  105.     }
  106.     return dist[snk]!=-1;
  107. }
  108.  
  109. LL dfs(LL u, LL fl)
  110. {
  111.     if(u==snk) return fl;
  112.     for(LL &e=pro[u], v, df; e>=0; e=nxt[e])
  113.     {
  114.         v = to[e];
  115.         if(flow[e] < cap[e] && dist[v]==dist[u]+1)
  116.         {
  117.             df = dfs(v, min(cap[e]-flow[e], fl));
  118.             if(df>0)
  119.             {
  120.                 flow[e] += df;
  121.                 flow[e^1] -= df;
  122.                 return df;
  123.             }
  124.         }
  125.     }
  126.     return 0;
  127. }
  128.  
  129. LL dinitz()   // 1-based indexing
  130. {
  131.     LL ret = 0;
  132.     LL df;
  133.     while(bfs())
  134.     {
  135.         for(int i=1; i<=nNode; i++) pro[i] = fin[i];
  136.         while(true)
  137.         {
  138.             df = dfs(src, inf);
  139.             if(df) ret += df;
  140.             else break;
  141.         }
  142.     }
  143.     return ret;
  144. }
  145. struct edge{
  146.     int u, v, c;
  147. };
  148. vector<edge> E;
  149. int n, m, x;
  150. bool ok(db mid)
  151. {
  152. //    D(mid);
  153.     int src = n+1;
  154.     init(src,n,n+1);
  155.     add(src,1,x);
  156.     for(int i = 0; i<E.size(); i++)
  157.         add(E[i].u,E[i].v,(E[i].c/mid)+eps);
  158.     if(dinitz() == x)
  159.         return true;
  160.     return false;
  161. }
  162. int main()
  163. {
  164. //    freopen("in.txt","r",stdin);
  165. //    freopen("out.txt","w",stdout);
  166.     int i, j, cs, t, u, v,c;
  167.     sfff(n,m,x);
  168.     FRE(i,1,m)
  169.     {
  170.         sfff(u,v,c);
  171.         E.pb({u,v,c});
  172.     }
  173.     db lo = eps, hi = 2e6;
  174. //    D(ok(1.0/x));return 0;
  175.  
  176. //    if(n == 50)
  177. //        D(ok(4160084.5279072807));
  178.     for(int i = 1; i<=400; i++)
  179.     {
  180.         db mid = (lo+hi)/2;
  181.         if(ok(mid))
  182.             lo = mid;
  183.         else
  184.             hi = mid;
  185.     }
  186.     printf("%.10f\n",x*lo);
  187.  
  188.     return 0;
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement