Ford-Fulkerson算法

戳戳http://www.cnblogs.com/luweiseu/archive/2012/07/14/2591573.html

Ford-Fulkerson方法依赖于三种重要思想:残留网络,增广路径和割。

Ford-Fulkerson方法是一种迭代的方法。开始时,对所有的u,v∈V有f(u,v)=0,即初始状态时流的值为0。在每次迭代中,可通过寻找一条“增广路

径”来增加流值。增广路径可以看成是从源点s到汇点t之间的一条路径,沿该路径可以压入更多的流,从而增加流的值。反复进行这一过程,直至增广路

径都被找出来,根据最大流最小割定理,当不包含增广路径时,f是G中的一个最大流。

代码:

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <queue> const int N=1005; int pre[N]; //保存增广路径上的点的前驱顶点
bool vis[N];
int map[N][N]; //残留网络容量 int s,t; //s为源点,t为汇点
int n,m; bool BFS() //找增广路
{
int i,cur;
std::queue<int>Q;
memset(pre,0,sizeof(pre));
memset(vis,0,sizeof(vis));
vis[s]=true; Q.push(s);
while(!Q.empty())
{
cur=Q.front();
Q.pop(); if(cur==t) return true; //如果已达到汇点t,表明已经找到一条增广路径,返回true.
for(i=1;i<=n;i++)
{
if(!vis[i]&&map[cur][i]) //只有残留容量大于0时才存在边
{
Q.push(i);
pre[i]=cur;
vis[i]=true;
}
}
}
return false;
} int Max_Flow()
{
int i,ans=0;
while(true)
{
if(!BFS()) return ans; //如果找不到增广路径就返回。
int Min=999999999;
for(i=t;i!=s;i=pre[i]) //通过pre[]数组查找增广路径上的边,求出残留容量的最小值。
Min=std::min(Min,map[pre[i]][i]);
for(i=t;i!=s;i=pre[i])
{
map[pre[i]][i]-=Min;
map[i][pre[i]]+=Min;
}
ans+=Min;
}
} int main()
{
int T,k=1;
int u,v,c;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
s=1; t=n;
memset(map,0,sizeof(map));
while(m--)
{
scanf("%d%d%d",&u,&v,&c);
map[u][v]+=c;
}
printf("Case %d: %d\n",k++,Max_Flow());
}
return 0;
}

hdu 3549最大流Ford-Fulkerson算法的更多相关文章

  1. 【网络流#1】hdu 3549 - 最大流模板题

    因为坑了无数次队友 要开始学习网络流了,先从基础的开始,嗯~ 这道题是最大流的模板题,用来测试模板好啦~ Edmonds_Karp模板 with 前向星 时间复杂度o(V*E^2) #include& ...

  2. hdu 3549 最大流

    #include<stdio.h> #include<string.h> #include<queue> #include<iostream> usin ...

  3. ACM/ICPC 之 网络流入门-Ford Fulkerson与SAP算法(POJ1149-POJ1273)

    第一题:按顾客访问猪圈的顺序依次构图(顾客为结点),汇点->第一个顾客->第二个顾客->...->汇点 //第一道网络流 //Ford-Fulkerson //Time:47M ...

  4. HDU 3549 Flow Problem(最大流)

    HDU 3549 Flow Problem(最大流) Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...

  5. hdu 3549 Flow Problem (网络最大流)

    Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tota ...

  6. poj 1273 Drainage Ditches(最大流,E-K算法)

    一.Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clove ...

  7. Flow Problem HDU - 3549

    Flow Problem HDU - 3549 Network flow is a well-known difficult problem for ACMers. Given a graph, yo ...

  8. 网络流 HDU 3549 Flow Problem

    网络流 HDU 3549 Flow Problem 题目:pid=3549">http://acm.hdu.edu.cn/showproblem.php?pid=3549 用增广路算法 ...

  9. HDU 1532 最大流入门

    1.HDU 1532 最大流入门,n个n条边,求第1点到第m点的最大流.只用EK做了一下. #include<bits/stdc++.h> using namespace std; #pr ...

随机推荐

  1. Python网络数据采集6-隐含输入字段

    Python网络数据采集6-隐含输入字段 selenium的get_cookies可以轻松获取所有cookie. from pprint import pprint from selenium imp ...

  2. Aero问题

    有时候打开电脑会发现自己的桌面有点不一样,没有原来的好看.别着急,这是因为你的Aero没有正常启动.

  3. HTML学习笔记2

    5.超链接 3种超链接: 1. 连接到其他页面 2. 锚: (是链接页面)指给超链接起一个名字,作用是连接到本页面或者其他页面的特定位置.使用name属性给超链起名字,本页要加# 3. 连接到邮件: ...

  4. shader之半兰伯特漫反射

    看很多人实现shader都用插件shader force,那我还学shader干X!!!??? 好了,废话不多说,学习shader去.... 漫反射在shader里算是最基础的知识了.入手shader ...

  5. JS正则密码复杂度校验之:JS正则匹配半角英文符号

    概述 在JS密码校验中常常会遇到密码强度的校验需求,借用一位朋友提问的图,他在工作中遇到的一个比较经典的密码强度校验要求: 这个需求有两个难点,一,是如何使用正则匹配所有半角英文标点符号,二,是如何验 ...

  6. MySQL进程处于Waiting for table flush的分析

      最近遇到一个案例,很多查询被阻塞没有返回结果,使用show processlist查看,发现不少MySQL线程处于Waiting for table flush状态,查询语句一直被阻塞,只能通过K ...

  7. Fiddler模拟重发请求

    在测试的过程中会碰到模拟请求的重发或者修改请求的参数进行请求模拟发送 一.Reissue Sequentially 模拟多次重发 1.启用后fiddler:PC端或手机端创建某条数据后,session ...

  8. MySQL中count(1),count(*),count(col)的区别

    count(*)返回行数的时候不管列中的值是不是null,在MyISAM表中,count(*)被优化,因为在MyISAM表中,行数被额外存储了,所以会很快,但是这个时候不能有where条件.innod ...

  9. fs模块(二)

    1. renameSync 01. 重命名 02. 移动文件夹,相当于剪切作用 var fs = require('fs'); // 01 文件重命名 var renameFile = (oldFil ...

  10. 【Mybatis】配置文件加载属性

    Mybatis将按照下面的顺序来加载属性: 1.在properties文本定义的属性首先被读取, 2.然后读取Mybatis的配置文件sqlConfig.xml配置文件中properties标签属性 ...