首页 > 其他 > 详细

poj1273 Drainage Ditches (最大流模板)

时间:2017-03-04 18:40:13      阅读:196      评论:0      收藏:0      [点我收藏+]

http://poj.org/problem?id=1273

Dinic算法

在每次找增广路之前先跑一遍bfs,把所有点的深度标记,按bfs记下的顺序找增广路,这条增广路上最小的边容量就是这条增广路的最大费用

跑出一条增广路之后,就开始更新现在的边剩余的容量,并建立反向边。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,m,map[300][300],ans,pre[300];
void Flow(int s,int t){
    while(1){
        queue<int>q;
        q.push(1);
        memset(pre,0,sizeof(pre));
        while(!q.empty()){
            int point=q.front();
            q.pop();if(point==t)break;
            for(int i=1;i<=n;i++){
                if(map[point][i]&&!pre[i])pre[i]=point,q.push(i);
            }
        }if(pre[t]==0)break;
        int so=0x7fffffff;
        for(int i=t;i!=s;i=pre[i]){
            so=min(so,map[pre[i]][i]);
        }ans+=so;
        for(int i=t;i!=s;i=pre[i]){
            map[i][pre[i]]+=so;
            map[pre[i]][i]-=so;
        }
    }
}
int main(){
    while(scanf("%d%d",&m,&n)!=EOF){
        int f,t,v;
        memset(map,0,sizeof(map));
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&f,&t,&v);
            map[f][t]+=v;
        }
        ans=0;
        Flow(1,n);
        printf("%d\n",ans);
    }
} 

 

poj1273 Drainage Ditches (最大流模板)

原文:http://www.cnblogs.com/thmyl/p/6502074.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!