最大流之sap算法
若有向图G = (V , E)满足下列条件:
1、有且仅有一个顶点S,它的入度为 0 ,这个顶点称为源点。
2、有且仅有一个顶点T,它的出度为 0 ,这个顶点称为汇点。
3、每一条弧都有一个非负数,叫做这条边的容量,边(Vi , Vj)的容量用 Cij 来表示。
则此有向图称为网络流图,记为 G = ( V , E , C) ;
对于网络流图G中,每一条弧( i , j )都给定一个非负数Fij,对于一组数据满足下面三个条件时,称为可行流;
1、对于每条弧都有 Fij < Cij ;
2、出了源点S和汇点T之外,中间任意点流量守恒,即输入流等于输出流;
3、对于源点S和汇点T,从S出去多少就会从T流入多少;
假如有这么一条路,从源点开始,一直一段一段的连到了汇点,并且这条路上的每一段满足Fij < Cij ,则称这条路为增广路;
当找不到增广路时,当前流量就是最大流。
寻找增广路时可以简单地从源点开始做bfs,并不断修改这条路上的最大流。
但事实上并不是这么简单,上面所说的增广路还不是很完整,中间还存在一些细节问题,例如:
我们通过bfs遍历后得到第一条增广路 1 - 2 - 3 - 4 ,然后就不存在增广路径了,其实并不是这样,这个网络流的最大流明显为 2 ,我们可以是使用一个叫反向边的概念来解决这个问题,如图:
这样就解决了增广路算法中的一些细节问题;
加入一个网络图中有4个点,5条边组成。如下:
5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10
求最大流是多少?
下面给出相应的代码:
#include<iostream>
#include<queue> using namespace std ; int n , m ; int map[210][210] ; int path[210] ; int flow[210] ; int bfs() {
queue<int> q ;
memset(path,-1,sizeof(path)) ;
path[1] = 0 ;
flow[1] = (1<<30) ;
q.push(1) ;
while(!q.empty()) {
int t = q.front() ;
q.pop() ;
if(t == m) break ;
for(int i = 2 ; i <= m ; i++)
if(path[i] == -1 && map[t][i]) { // 该路径没有被访问过
flow[i]=flow[t]<map[t][i]?flow[t]:map[t][i]; // 该路径最小流量
q.push(i) ;
path[i] = t ; // 存储路径
}
}
if(path[m] == -1)
return -1 ;
return flow[m] ;
} void Edmonds_Karp() {
int max_flow = 0 , floww ;
while((floww=bfs())!=-1) {
max_flow += floww ;
int s , t ;
t = m ;
while(t != 1 ) {
s = path[t] ;
map[s][t] -= floww ;
map[t][s] += floww ;
t = s ;
}
}
cout << max_flow << endl ;
} int main() {
while(cin >> n >> m) {
memset(map,0,sizeof(map)) ;
while(n--) {
int u , v , cost ;
cin >> u >> v >> cost ;
map[u][v] += cost ;
}
Edmonds_Karp() ;
}
return 0 ;
}
![](\Users\Administrator.PC-20130117NAFF\AppData\Roaming\Tencent\Users\960786200\QQ\WinTemp\RichOle\K662)2S@0{S1EBG9MUA5YG4.jpg)
![](\Users\Administrator.PC-20130117NAFF\AppData\Roaming\Tencent\Users\960786200\QQ\WinTemp\RichOle\K662)2S@0{S1EBG9MUA5YG4.jpg)
最大流之sap算法的更多相关文章
- HDU1532 Drainage Ditches —— 最大流(sap算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 Drainage Ditches Time Limit: 2000/1000 MS (Java/ ...
- 最大流的SAP算法模板
明天补充~~~先上代码 #include<iostream> #include<string> #include<queue> #include<vector ...
- 网络流 最大流—最小割 之SAP算法 详解
首先引入几个新名词: 1.距离标号: 所谓距离标号 ,就是某个点到汇点的最少的弧的数量(即边权值为1时某个点到汇点的最短路径长度). 设点i的标号为level[i],那么如果将满足level[i]=l ...
- hdu3572Task Schedule 最大流,判断满流 优化的SAP算法
PS:多校联赛的题目质量还是挺高的.建图不会啊,看了题解才会的. 参考博客:http://blog.csdn.net/luyuncheng/article/details/7944417 看了上面博客 ...
- POJ 2455 网络流 基础题 二分+网络流 dicnic 以及 sap算法
Secret Milking Machine Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8189 Accepted: ...
- ACM/ICPC 之 网络流入门-Ford Fulkerson与SAP算法(POJ1149-POJ1273)
第一题:按顾客访问猪圈的顺序依次构图(顾客为结点),汇点->第一个顾客->第二个顾客->...->汇点 //第一道网络流 //Ford-Fulkerson //Time:47M ...
- StreamDM:基于Spark Streaming、支持在线学习的流式分析算法引擎
StreamDM:基于Spark Streaming.支持在线学习的流式分析算法引擎 streamDM:Data Mining for Spark Streaming,华为诺亚方舟实验室开源了业界第一 ...
- hdu2883 最大流,判断满流 优化的SAP算法
这是09年的多校联赛题目,比10年的难度要大.如果没做过hdu3572,建议先去做.有了解题思维再来做这题. 这题与hdu3572类似.但是1 <= si < ei <= 1,000 ...
- 关于最大流的EdmondsKarp算法详解
最近大三学生让我去讲课,我就恶补了最大流算法,笔者认为最重要的是让学弟学妹们入门,知道算法怎么来的?为什么是这样?理解的话提出自己的改进,然后再看看Dinic.SAP和ISAP算法….. 一.概念引入 ...
随机推荐
- iOS开发基本须要
iOS开发基本须要 1 准备好对应的硬件和软件配置------基于Intel处理器的Mac操作系统 2 具有C++,Java或其它面向对象编程语言的开发经验 3 最新的iphone SDK的下 ...
- ActiveMQ使用STOMP协议的一个错误问题:Unexpected ACK received for message-id
使用某些语言环境下的stomp包(比如php python ruby),可能会出现如下问题: Unexpected ACK received for message-id 这一般可能有两个原因. 1. ...
- oracle超过最大游标数异常分析(转贴)
问题描述 Oracle 使用 OPEN_CURSORS 参数指定一个会话一次最多可以打开的游标的数量.超过此数量时,Oracle 将报告 ORA-01000 错误.当此错误传播到 WebLogic S ...
- ASP.NET导出EXCEl方法使用EXCEl对象
导出功能必须使用 office中EXCEl对象,整个操作如同在操作EXCEl一样,建立EXCEl应用----建立工作簿---建立sheet表单页, 代码实现过程中,如果想对单元格实现一些操作,或者汇 ...
- 关于bootstrap弹出二级对话框的使用
弹出二级对话框,即在对话框的基础上再弹出一个对话框.这对于CRM管理类系统来说应用场景很常见.看到网上有关于实现二级弹出框的方法,需要在一级对话框页面上添加不少css样式.其实,完全可以不用这么麻烦. ...
- HTML5的绘图的支持
一.简单介绍canvas元素 <canvas.../>是HTML5新增的一个元素,该元素用于绘制图形.实际上<canvas../>只是相当于一张画布. 它除了可以指定通用属性外 ...
- Unity5UGUI 官方教程学习笔记(四)UI Image
Image Source image:源图片 需要显示的图片 Color:颜色 会与图片进行颜色的混合 Material:材质 Image Type: Simple 精灵只会延伸到适合Rec ...
- 创建以及加载模块【nodejs第四篇】
建立两个文件,文件一createModule.js ,文件二main.js createModule.js的代码,主要用于创建一个模块 /** * Created by Administrator o ...
- 搭建Hadoop集群 (三)
通过 搭建Hadoop集群 (二), 我们已经可以顺利运行自带的wordcount程序. 下面学习如何创建自己的Java应用, 放到Hadoop集群上运行, 并且可以通过debug来调试. 有多少种D ...
- python读取word表格内容(1)
1.首页介绍下word表格内容,实例如下: 每两个表格后面是一个合并的单元格