zoukankan      html  css  js  c++  java
  • Dinic 算法

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int N (1e5+5), M(1e5+5);
     5 
     6 int head[N];
     7 struct Edge{
     8     /*
     9     r: residual capacity
    10     */
    11     int v, r, nt;
    12 }E[M];
    13 int tail;
    14 void add_edge(int u, int v, int c){
    15     E[tail]={v, c, head[u]}, head[u]=tail++;
    16     E[tail]={u, 0, head[v]}, head[v]=tail++;
    17 }
    18 
    19 int level[N];
    20 void bfs(int s){
    21     memset(level, -1, sizeof(level));
    22     queue<int> que;
    23     level[s]=0;
    24     que.push(s);
    25     for(int u; !que.empty(); ){
    26         u=que.front(), que.pop();
    27         for(int i=head[u]; ~i; i=E[i].nt){
    28             int &v=E[i].v;
    29             if(E[i].r>0 && level[v]<0){
    30                 level[v]=level[u]+1;
    31                 que.push(v);
    32             }
    33         }
    34     }
    35 }
    36 
    37 int iter[N];
    38 int dfs(int u, int t, int f){
    39     /*
    40     t: terminal (sink)
    41     */
    42     if(u==t) return f;
    43     //for(int &i=iter[u]; i!=-1; i++){
    44     for(int &i=iter[u]; i!=-1; i=E[i].nt){
    45         int &v=E[i].v, &r=E[i].r;
    46         if(r>0 && level[u]<level[v]){
    47             int d=dfs(v, t, min(f, r));
    48             if(d>0){
    49                 r-=d;
    50                 E[i^1].r+=d;
    51                 return d;
    52             }
    53         }
    54     }
    55     return 0;
    56 }
    57 
    58 int dinic(int s, int t){
    59     const int INF=1<<30;
    60     for(int flow=0;;){
    61         bfs(s);
    62         if(level[t]<0) return flow;
    63         memcpy(iter, head, sizeof(iter));
    64         for(int f; f=dfs(s, t, INF); flow+=f);
    65     } 
    66 }
    67 
    68 void init(){
    69     tail=0;
    70     memset(head, -1, sizeof(head));
    71 }    
  • 相关阅读:
    java private修饰的类和变量
    Volatile和Synchronized对可见性和原子性的支持
    Socket套接字
    Spring MVC请求执行流程
    Spring AOP术语解释
    equals()和==的区别
    约瑟夫环之递归算法
    数据库特性之原子性和一致性
    设计模式之单例模式
    平衡二叉树的插入旋转
  • 原文地址:https://www.cnblogs.com/Patt/p/5014463.html
Copyright © 2011-2022 走看看