最大流最小割学习 基本知识 | 证明 | FF算法
可行流 : 能流过去就行,不一定是最大流。
最大流:能流到的最大流量。(可能不只一个)
解决最大流:
Ford-Fulkerson方法
最小割:从图中去除一些边,使得源点S到汇点T不连通,去除的这些边权的权和最小,就是最小割
PS!!!这个权和可以证明等于网络的最大流量!
最大流等价于最小割!!! 求解最大流问题,也可以转化为最小割
但是求最大流和求最小割集是两类不同的算法。求解最小割集普遍采用Stoer-Wagner算法
1》》任意割大于等于任意流
从源点到汇点必然经过割边(必然存在其中一条边是割边)那么令S - T的分支流分别为f1,f2,^...fn,f1 + f2 + …… fn = f
(流——你可以少,但不能多,多过这条边的流限制就错了,所以,分割S,T集合后,流向T的必然会完全流入T,而割就是如何分割S,T
所以f1<=c1,f2<= c2,f3 <= c3
所以任意可行的割ci + cj + ck >= fi + fj + fk
2》最大流 = 最小割
(思考问题的时候要把每一条边分离出来看,对于合并的流也应该拆开)
最大流是不能再流了,所以对于每一条分流中,必然存在一条边 i,使得fi == ci,对于这条边源头的流出目的是我要满足达到ci的流量即为最大流,且fi >= fk(k!=i),所以ci也是最小的容量
所以对于每一个分流,我都会割取最小的容量边,而又因为是最大流,所以最小容量边必然满流,否则必然存在增广路径使的当前流变为最大流,所以最小割对应的容量即为最大流
求解最大流算法:
最简单的FF算法:
当然因为简单易操作,所以时间复杂度较高,一般不会使用在ACM上,但一切都是以简单为基础的
FF算法的思想:
从s到t一直寻找可行最大流量,找到一个,最终的最大流加上它,然后就不找了,回溯,维护正向边和逆向边,然后回溯完了,进行适当的初始化后再重新找,直到找不到位置
从我的描述方面就能看出,FF算法做了很多重复性的工作,一条边一条线可能被扫多次,但是没有标记这条边不可行,因为只有边可行才会维护删权
接下来是代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define inf (1<<28)
using namespace std;
typedef long long ll;
const int maxn = 1e4 + 1e2;
const int maxm = 1e5 + 1e3;
//n个点 m条边
//从s - t求最大流
int n,m,s,t;
//链式前向星存储
struct node
{
int to,cost,pre;
}e[maxm<<1];
int id[maxn],cnt;
//最大流量ans
ll ans;
//dfs中
bool vis[maxn],flag;
void add(int from,int to,int cost)
{
e[cnt].to = to;
e[cnt].cost = cost;
e[cnt].pre = id[from];
id[from] = cnt++;
}
int dfs(int now,int flow)
{
if(now == t)
{
flag = true;
ans += flow;
return flow;
} vis[now] = 1; for(int i = id[now];~i;i = e[i].pre)
{
int to = e[i].to;
int cost = e[i].cost; if(vis[to] || cost == 0)continue; int delta = dfs(to,min(flow,cost)); if(flag)
{
e[i].cost -= delta;
e[i^1].cost += delta;
return delta;
}
}
return 0;
}
void FF()
{
flag = false;
memset(vis,0,sizeof(vis));
dfs(s,inf);
while(flag)
{
memset(vis,0,sizeof(vis));
flag = false;
dfs(s,inf);
}
}
void init()
{
memset(id,-1,sizeof(id));
cnt = 0;
ans = 0;
}
int main()
{
while(~scanf("%d%d%d%d",&n,&m,&s,&t))
{
init();
int from,to,cost;
for(int i = 1;i <= m;++i)
{
scanf("%d%d%d",&from,&to,&cost);
add(from,to,cost);
add(to,from,0);
}
FF();
printf("%lld\n",ans);
}
return 0;
}
最大流最小割学习 基本知识 | 证明 | FF算法的更多相关文章
- OTSU算法学习 OTSU公式证明
OTSU算法学习 OTSU公式证明 1 otsu的公式如下,如果当前阈值为t, w0 前景点所占比例 w1 = 1- w0 背景点所占比例 u0 = 前景灰度均值 u1 = 背景灰度均值 u = ...
- sw算法求最小割学习
http:// blog.sina.com.cn/s/blog_700906660100v7vb.html 转载:http://www.cnblogs.com/ylfdrib/archive/201 ...
- hiho 第116周,最大流最小割定理,求最小割集S,T
小Hi:在上一周的Hiho一下中我们初步讲解了网络流的概念以及常规解法,小Ho你还记得内容么? 小Ho:我记得!网络流就是给定了一张图G=(V,E),以及源点s和汇点t.每一条边e(u,v)具有容量c ...
- hihocoder 网络流二·最大流最小割定理
网络流二·最大流最小割定理 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi:在上一周的Hiho一下中我们初步讲解了网络流的概念以及常规解法,小Ho你还记得内容么? ...
- 最大流最小割——bzoj1001狼抓兔子,洛谷P2598
前置知识 平面图 平面图就是平面上任意边都不相交的图.(自己瞎画的不算XD) 对偶图 比如说这个图,我们发现平面图肯定会把平面分成不同的区域(感觉像拓扑图),并把这些区域当做每个点(不被包围的区域独自 ...
- 强化学习-MDP(马尔可夫决策过程)算法原理
1. 前言 前面的强化学习基础知识介绍了强化学习中的一些基本元素和整体概念.今天讲解强化学习里面最最基础的MDP(马尔可夫决策过程). 2. MDP定义 MDP是当前强化学习理论推导的基石,通过这套框 ...
- [HihoCoder1378]网络流二·最大流最小割定理
思路: 根据最大流最小割定理可得最大流与最小割相等,所以可以先跑一遍EdmondsKarp算法.接下来要求的是经过最小割切割后的图中$S$所属的点集.本来的思路是用并查集处理所有前向边构成的残量网络, ...
- HDU 1569 方格取数(2)(最大流最小割の最大权独立集)
Description 给你一个m*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的数的和最大. ...
- FZU 1844 Earthquake Damage(最大流最小割)
Problem Description Open Source Tools help earthquake researchers stay a step ahead. Many geological ...
随机推荐
- Linux命令大全完整版
1. linux系统管理命令 adduser 功能说明:新增用户帐号.语 法:adduser补充说明:在Slackware中,adduser指令是个script程序,利用交谈的方式取得输入的用户帐 ...
- Java界面编程—事件的种类
Java处理事件相应的类和监听接口大多位于 awt 包中. 在 java.swing.event 包中有专门用于 swing 组件的事件类和监听接口. awt 事件类继承自 AWTEvent,其超类是 ...
- Spring ConversionService 类型转换(二) ConversionService
Spring ConversionService 类型转换(二) ConversionService Spring 系列目录(https://www.cnblogs.com/binarylei/p/1 ...
- hdfs结构
hdfs文件系统主要由四部分组成:client客户端.namenode.datanode.secondary namenode. client:1.分割文件成block. 2.与namenode交 ...
- android DatagramSocket send 发送数据出错
安卓4.0以后好像不能在主线程里面使用 socket 所以不管是发送数据还是接收数据需要新开一个了线程: 以下代码是我点击发送是代码: new Thread(new Runnable() { @Ove ...
- 《MinDoc 接口文档在线管理系统》
项目简介 MinDoc 是一款针对IT团队开发的简单好用的文档管理系统. MinDoc 的前身是 SmartWiki 文档系统.SmartWiki 是基于 PHP 框架 laravel 开发的一款文档 ...
- redis2
一.安装redis 1) 下载redis安装包 可去官网http://redis.io ,也可通过wget命令, wget http://download.redis.io/redis-sta ...
- MySQL基准测试--innodb_buffer_pool_instances
http://blog.chinaunix.net/uid-26896862-id-3345441.html 目的 根据现有硬件环境下,测试MySQL单实例下,在数据量小于innodb_buffer_ ...
- python之数据库内置方法以及pymysql的使用
一.mysql内置方法 1)视图的概念和用法 .什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的直接使用即可 .为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 .如何用视 ...
- Tkinter添加图片
Tkinter添加图片的方式,与Java相似都是利用label标签来完成的: 一.默认的是gif的格式,注意将png后缀名修改为gif还是无法使用,文件格式依然错误. photo = PhotoIma ...