【模板】dinic初体验

来源:互联网 发布:淘宝上怎么搜迷你钢弩 编辑:程序博客网 时间:2024/06/05 21:09

题目描述

觊觎已久的dinic网络流~
果然还是晓犇讲代码神啊~~~@Starria
第一个板子就在这里开荒留下足迹吧w~

#include<cstdio>#include<algorithm>#define N 1100#define INF 1000000000using namespace std;struct node{    long long to,len,nxt;}table[N<<1];long long tot=2,head[N],queue[N],l,r,n,m,S,T,ans=0;void add(long long x,long long y,long long z){    table[tot].len=z,table[tot].to=y,table[tot].nxt=head[x],head[x]=tot++;    table[tot].len=0,table[tot].to=x,table[tot].nxt=head[y],head[y]=tot++;    return;}long long vis[N];bool bfs(){    l=r=0;    for(long long i=0;i<=n;i++){        vis[i]=0;    }    vis[S]=1;    queue[r++]=S;    while(l!=r){        long long t=queue[l++];        for(long long i=head[t];i;i=table[i].nxt){            if((!vis[table[i].to])&&table[i].len){                vis[table[i].to]=vis[t]+1;                queue[r++]=table[i].to;            }        }    }    if(vis[T]){        return true;    }    return false;}long long dfs(long long x,long long val){    if(x==T){        return val;    }    long long res=0;    for(long long i=head[x];i;i=table[i].nxt){        if(table[i].len!=0&&vis[table[i].to]==vis[x]+1){            long long chg=dfs(table[i].to,min(val,table[i].len));            table[i].len-=chg,table[i^1].len+=chg,val-=chg,res+=chg;        }    }    return res;}int main(){    scanf("%lld%lld%lld%lld",&n,&m,&S,&T);    for(long long i=0;i<m;i++){        long long x,y,z;        scanf("%lld%lld%lld",&x,&y,&z);        add(x,y,z);    }    while(bfs()){ans+=dfs(S,INF);};    printf("%lld\n",ans);    return 0;}
原创粉丝点击