Advertisement
Emiliatan

dinic

Nov 25th, 2019
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.45 KB | None | 0 0
  1. using int64 = long long;
  2.  
  3. constexpr int MAXE = 25000, MAXV = 105, INF = 0x7f7f7f7f;
  4. struct Element
  5. {
  6.     int to, cap, last;
  7. }e[MAXE];
  8.  
  9. int head[MAXV], head_point = 0;
  10. int dis[MAXV];
  11. bool vis[MAXV];
  12.  
  13. inline void __init() //call this before you use dinic
  14. {
  15.     memset(head, -1, sizeof(head));
  16.     head_point = 0;
  17. }
  18.  
  19. inline void addedge(int from, int to, int cap)
  20. {
  21.     e[head_point] = Element{to,cap,head[from]};
  22.     head[from] = head_point++;
  23.    
  24.     e[head_point] = Element{from,cap,head[to]};
  25.     head[to] = head_point++;
  26. }
  27.  
  28. bool __bfs(int s, int t)
  29. {
  30.     memset(vis, false, sizeof(vis));
  31.     memset(dis, 0x7f, sizeof(dis));
  32.  
  33.     queue<int> qu;
  34.    
  35.     vis[s] = true;
  36.     dis[s] = 0;
  37.     qu.emplace(s);
  38.  
  39.     while(!qu.empty())
  40.     {
  41.         int now = qu.front(); qu.pop();
  42.         for(int i = head[now]; i != -1; i = e[i].last)
  43.         {
  44.             int to = e[i].to;
  45.             if(e[i].cap > 0 && !vis[to])
  46.             {
  47.                 dis[to] = dis[now] + 1;
  48.                 vis[to] = true;
  49.                 qu.emplace(to);
  50.                 if(to == t) return true;
  51.             }
  52.         }
  53.     }
  54.     return false;
  55. }
  56. int __dfs(int now, int flow, int s, int t)
  57. {
  58.     if(now==t) return flow;
  59.     if(vis[now]) return 0;
  60.  
  61.     vis[now] = true;
  62.  
  63.     for(int i = head[now]; i != -1; i = e[i].last)
  64.     {
  65.         int to = e[i].to;
  66.         if(e[i].cap > 0 && dis[to] == dis[now] + 1)
  67.         {
  68.             int max_flow = __dfs(to, min(flow, e[i].cap), s, t);
  69.             if(max_flow != 0)
  70.             {
  71.                 e[i].cap -= max_flow;
  72.                 e[i^1].cap += max_flow;
  73.                 return max_flow;
  74.             }
  75.         }
  76.     }
  77.     return 0;
  78. }
  79. int64 __dinic(int s, int t)
  80. {
  81.     int64 result_flow = 0;
  82.     while(__bfs(s, t))
  83.         while(true)
  84.         {
  85.             memset(vis, false, sizeof(vis));
  86.             int f = __dfs(s, INF, s, t);
  87.             if(f == 0) break;
  88.             result_flow += f;
  89.         }
  90.     return result_flow;
  91. }
  92. int main()
  93. {
  94.     int in_n, in_s, in_t, in_c, in_from, in_to, in_cap, kase = 1;
  95.     while(~scanf("%d", &in_n) && in_n)
  96.     {
  97.         __init();
  98.  
  99.         scanf("%d %d %d", &in_s, &in_t, &in_c);
  100.         for(int i = 0; i < in_c && scanf("%d %d %d", &in_from, &in_to, &in_cap); i++)
  101.             addedge(in_from, in_to, in_cap);
  102.  
  103.         printf("Network %d\n", kase++);
  104.         printf("The bandwidth is %lld.\n\n", __dinic(in_s, in_t));
  105.     }
  106.     return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement