dinic codevs 1993 草地排水题解

来源:互联网 发布:财经大数据 编辑:程序博客网 时间:2024/04/29 21:36

题目:

http://codevs.cn/problem/1993/


显然这道题是一道不用建模的裸dinic(好多网络流根本不知道是网络流啊233,可能是我太弱)


就是裸的我就不bb了,这里正向边和反向边我是用的x和x^1来存储的,代码不算长吧,关于dinic,如果需要复习或者不懂的,可以看这篇博文:
https://comzyh.com/blog/archives/568/

#include<cstdio>#include<cstring>#include<iostream>#include<queue>#define MAXN 500+10#define oo 0x7ffffffusing namespace std;struct Line{    int from,to,next,cost;}line[MAXN];int head[MAXN],tail,level[MAXN],n,m,te,mp,temp;int s=1,t,cnt;void add_line(int from,int to,int fee){    tail++;    line[tail].from=from;    line[tail].to=to;    line[tail].cost=fee;    line[tail].next=head[from];    head[from]=tail;}bool bfs(){    memset(level,0xff,sizeof(level));    queue<int>q;    level[s]=0;q.push(s);    while(!q.empty()){        int u=q.front();q.pop();        for(int i=head[u];i;i=line[i].next){            int v=line[i].to;            if(line[i].cost>0&&level[v]==-1){                level[v]=level[u]+1;                q.push(v);            }        }    }    if(level[t]==-1) return false;    return true;}int dfs(int u,int maxflow){    if(u==t) return maxflow;    for(int i=head[u];i;i=line[i].next){        int v=line[i].to;        if(line[i].cost>0&&level[u]<level[v]){            int flow=dfs(v,min(maxflow,line[i].cost));            if(flow>0){                line[i].cost-=flow;                line[i^1].cost+=flow;                return flow;            }         }    }    return 0;} int main(){    scanf("%d%d",&n,&m);t=m;    for(int i=1;i<=n;i++){        scanf("%d%d%d",&te,&mp,&temp);        add_line(te,mp,temp);        add_line(mp,te,0);    }    while(bfs()) cnt+=dfs(s,oo);        cout<<cnt;    return 0;} 

这里写图片描述