最大流复习

最大流就是最原始的网络流,有源点和汇点源点是无穷大

FF算法(思想很简单就是先找一个增广路径,然后构建残余网络,在残余网络中继续找增广路径.....直到找不到累加的流量就是最大值(具体原理可以通过最小割证明))

#include <iostream>
#include <cstring>
using namespace std;
const int N =1010;
const int M =20010;
int n,m;
int h[N],to[M],ne[M],cap[M],vi[N],idx=0;

void add(int a,int b,int w){
    to[idx]=b;
    ne[idx]=h[a];
    cap[idx]=w;
    h[a]=idx++;
}

int dfs(int v,int t,int f){
    if(v==t)return f;
    vi[v]=1;
    for(int i=h[v];~i;i=ne[i]){
        int tem=to[i];
        if(!vi[tem]&&cap[i]>0){
            int d=dfs(tem,t,min(f,cap[i]));
            if(d>0){
                //如果搜到一个流量大于0那么就停止
                cap[i]-=d;
                //i+1为反向边
                cap[i^1]+=d;
                return d;
            }
        }
    }
    return 0;
}

int max_f(int s,int t){
    int flow=0;
    while(true){
        memset(vi,0,sizeof(vi));
        int f=dfs(s,t,0x3f);
        if(f==0)return flow;
        flow+=f;
    }
}

int main(){
    cin>>n>>m;
    memset(h,-1,sizeof h);
    for(int i=0;i<m;i++){
        int a,b,c;
        cin>>a>>b>>c;
        add(a,b,c);
        add(b,a,0);
    }
    cout<<max_f(1,n)<<endl;
}

 

posted @ 2020-02-12 20:37  kstranger  阅读(158)  评论(0)    收藏  举报