USACO4.2.1 网络流最大流算法

/*
ID:hk945801
TASK:ditch
LANG:C++
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int inf=10000001;
struct node{
	int c,f;
}a[201][201];
int p[201*201],d[201*201],pre[201];
int main(){
	int i,j,k,m,n;
	int x;
	freopen("ditch.in","r",stdin);
	freopen("ditch.out","w",stdout);
	cin>>m>>n;
    for(i=1;i<=m;i++){
	    int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        a[x][y].c+=z;
    }
    int pd=1;
    while(pd){
	    pd=0;
	    int fi=0,l=1;
	    d[1]=1;
	    for(i=1;i<=n;i++)p[i]=0;
        p[1]=1;
        while(fi<l){
            fi++;
        x=d[fi];
            for(i=2;i<=n;i++)
                if(!p[i] && (a[x][i].c>a[x][i].f || a[i][x].f>0)){
                    d[++l]=i;
                    p[i]=1;
                    pre[i]=x;
                    if(i==n){pd=1;break;}
                }
            if(pd==1)break;
        }
        if(pd==0)break;
        int min=inf;
        x=n;
        while(x!=1){
            if(a[pre[x]][x].c>a[pre[x]][x].f&& a[pre[x]][x].c-a[pre[x]][x].f<min)
                min=a[pre[x]][x].c-a[pre[x]][x].f;
            else if(a[x][pre[x]].f>0 && a[x][pre[x]].f<min)
                min=a[x][pre[x]].f;
            x=pre[x];
        }
        x=n;
        while(x!=1){
            if(a[pre[x]][x].c>a[pre[x]][x].f)
                a[pre[x]][x].f+=min;
            else if(a[x][pre[x]].f>0)
                a[x][pre[x]].f-=min;
            x=pre[x];
        }
	}
	int ans=0;
    for(i=2;i<=n;i++)
        ans+=a[1][i].f;
    cout<<ans<<endl;
	return 0;
}
时间: 2024-10-08 10:04:11

USACO4.2.1 网络流最大流算法的相关文章

(转) 网络流之最大流算法(EdmondsKarp)

求网络流有很多算法,这几天学习了两种,记录一下EK算法. 首先是网络流中的一些定义: V表示整个图中的所有结点的集合.E表示整个图中所有边的集合.G = (V,E) ,表示整个图.s表示网络的源点,t表示网络的汇点.对于每条边(u,v),有一个容量c(u,v)   (c(u,v)>=0),如果c(u,v)=0,则表示(u,v)不存在在网络中.相反,如果原网络中不存在边(u,v),则令c(u,v)=0.对于每条边(u,v),有一个流量f(u,v). 一个简单的例子.网络可以被想象成一些输水的管道.

网络流最大流——dinic算法

前言 网络流问题是一个很深奥的问题,对应也有许多很优秀的算法.但是本文只会讲述dinic算法 最近写了好多网络流的题目,想想看还是写一篇来总结一下网络流和dinic算法以免以后自己忘了... 网络流问题简述 一个很普遍的例子就是--你家和自来水厂之间有许多中转站,中转站又由一些水管连接着.我们假设自来水厂的供水是无限的,并且中转站内能存储的水量也是无限的,但是管道有宽又窄,很显然管道内的流量必须小于等于管道的承载范围(否则管道就被撑爆了),那么问题就是要你求出你家最多能收到多大流量的水. emm

POJ 2455 Secret Milking Machine(搜索-二分,网络流-最大流)

Secret Milking Machine Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9658   Accepted: 2859 Description Farmer John is constructing a new milking machine and wishes to keep it secret as long as possible. He has hidden in it deep within

hihocoder网络流一&#183;Ford-Fulkerson算法

网络流一·Ford-Fulkerson算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho住在P市,P市是一个很大很大的城市,所以也面临着一个大城市都会遇到的问题:交通拥挤. 小Ho:每到周末回家感觉堵车都是一种煎熬啊. 小Hi:平时交通也还好,只是一到上下班的高峰期就会比较拥挤. 小Ho:要是能够限制一下车的数量就好了,不知道有没有办法可以知道交通系统的最大承受车流量,这样就可以限制到一个可以一直很顺畅的数量了. 小Hi:理论上是有算法的啦.早在1

hiho一下 第115周:网络流一?Ford-Fulkerson算法 (Edmond-Karp,Dinic,SAP)

来看一道最大流模板水题,借这道题来学习一下最大流的几个算法. 分别用Edmond-Karp,Dinic ,SAP来实现最大流算法. 从运行结过来看明显SAP+当前弧优化+gap优化速度最快.   hiho一下 第115周:网络流一•Ford-Fulkerson算法 原题网址:http://hihocoder.com/contest/hiho115/problem/1 网络流一·Ford-Fulkerson算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和

最大流算法(Edmons-Karp + Dinic 比较) + Ford-Fulkson 简要证明

Ford-Fulkson用EK实现:483ms #include <cstdio> #include <cstring> #define min(x,y) (x>y?y:x) int pre[105],q[105]; int F[105][105]; int n,nc,np,m,s,t,all; int MaxFlow(int s, int t){ int ans=0; while(1){ memset(pre,0,sizeof(pre)); int head=0,tail=

[笔记] 网络流-最大流 POJ-1273\HDU-4240

[1] POJ-1273 题目:http://poj.org/problem?id=1273 最直接的最大流问题,用了Ford-Fulkerson方法,DFS随机搜索增广路. 算法原理参考:http://blog.csdn.net/smartxxyx/article/details/9293665 /************************ POJ-1273* Ford-Fulkerson***********************/#include <stdio.h> #inclu

【网络流最大流】poj3281Dining

/* EK算法版本的,比较慢哦.....详见下面dinic版本 ----------------------------------------- 题目是网络流最大流的问题 ---------------------------------------- 建图: 关键:拆点 把每个牛拆成两个点,牛作为一个点有流量限制,即每一头牛只能的一份饭. 把牛拆开后,将边的权值赋值为1, ---------------------------------------- 建好图后就可以EK算法最大流了 ---

[知识点]网络流之Dinic算法

// 此博文为迁移而来,写于2014年2月6日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vrg4.html 今天我们来谈谈网络流之Dinic算法.这种算法相比Edmond-Karp算法,更加快速,更加常用.还记得EK吗?每次为了防止流量堵塞,必须进行多次BFS/DFS,非常费时间.而Dinic大叔非常机智的发明了Dinic算法,让这个问题得以解决. Dinic的核心内容是:反复进行BFS绘制出层次图,和DFS进行