网络最大流——HDU

题目链接

模板题练练手

题目代码

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
typedef long long LL;
const int N=207;
const int INF=0x3f3f3f3f;
int head[N],deep[N];
LL maxflow;
int n,m,tot,si,ei,ci;
struct edge{
    int to,next;
    LL dis;
}e[N*2];
void add(int u,int v,LL w){
    e[tot].to=v;
    e[tot].dis=w;
    e[tot].next=head[u];
    head[u]=tot++;
}
bool Bfs(int s,int t){
    memset(deep,0,sizeof(deep));
    queue<int>q;
    deep[s]=1;
    q.push(1);
    while(!q.empty()){
        int u=q.front();q.pop();
        for(int i=head[u];i!=-1;i=e[i].next){
            int v=e[i].to;
            if(!deep[v]&&e[i].dis){
                deep[v]=deep[u]+1;
                q.push(v);
            }
        }
    }return deep[t];
}
LL Dfs(int u,int t,LL dis){
    if(u==t||!dis)return dis;
    LL sum=0;
    for(int i=head[u];i!=-1;i=e[i].next){
        int v=e[i].to;
        if(deep[v]==deep[u]+1&&e[i].dis){
            LL temp=Dfs(v,t,min(dis,e[i].dis));
            if(temp){
                sum+=temp;
                dis-=temp;
                e[i].dis-=temp;
                e[i^1].dis+=temp;
                if(!dis)break;
            }
        }
    }return sum;
}
void Dinic(int s,int t){
    while(Bfs(s,t)){
        maxflow+=Dfs(s,t,INF);
    }
}
void init(){
    memset(head,-1,sizeof(head));
    tot=maxflow=0;
}
int main(){
    while(~scanf("%d%d",&n,&m)){
        init();
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&si,&ei,&ci);
            add(si,ei,ci),add(ei,si,0);
        }
        Dinic(1,m);
        printf("%lld
",maxflow);
    }
    return 0;
}

要建反向边,记得结构数大小乘二哦

原文地址:https://www.cnblogs.com/helman/p/11295882.html