学习这个算法是为学习图像处理中的图割算法做准备的。

基本概念:

1.最大流是一个有向图。

2.一个流是最大流,当且仅当它的残余网络中不包括增广路径。

3.最小割就是网络中所有割中值最小的那个割,最小割是不唯一的,不过最小割的值是唯一的。

4.最大流的流量等于某一最小割的容量。

算法思想就是Ford-Fulkerson方法。

具体流程:

1.首先使用广度优先搜索找到源节点到汇节点的一条路径,为增广路径。

2.如果找不到新的从源到汇的增广路径,则上一次求得的网络就是最大流,否则向下执行。

3.找出增广路径中最小的路径的值。

5.用路径中最小的值构造最大流网络,原网络包含这个网络。

4.将增广路径中所有的路径减去最小路径这个值,形成新的网络图。

6.对新的网络图继续执行第1步。

网络图如下,没什么好办法形象表示。我比较懒,不想画图了,真想看明白过程就看算法导论405页。

原网络:

最大流:

matlab代码如下:

clear all;close all;clc
%初始化邻接压缩表,算法导论405页的图 b=[ ;
;
;
;
;
;
;
;
;
]; m=max(max(b(:,:))); %压缩表中最大值就是邻接矩阵的宽与高
A=compresstable2matrix(b); %从邻接压缩表构造图的矩阵表示
netplot(A,); maxflow=zeros(m,m);
while %下面用广度优先搜索找增广路径
flag=[]; %相当于closed表,已访问过的节点
flag=[flag ];
head=;
tail=;
queue=[]; %队列,相当于open表,将要访问的节点
queue(head)=;
head=head+; pa=zeros(,m); %每个节点的前趋
pa()=; %源节点前趋是自己
while tail~=head %广度优先搜索,具体细节就不注释了
i=queue(tail);
for j=:m
if A(i,j)> && isempty(find(flag==j,))
queue(head)=j;
head=head+;
flag=[flag j];
pa(j)=i;
end
end
tail=tail+;
end if pa(m)== %如果搜索不到汇节点,退出循环
break;
end path=[];
i=m; %从汇节点开始
k=; %路径包含的边的个数
while i~= %使用前趋构造从源节点到汇节点的路径
path=[path;pa(i) i A(pa(i),i)]; %存入路径
i=pa(i); %使用前趋表反向搜寻,借鉴Dijsktra中的松弛方法
k=k+;
end
Mi=min(path(:,)); %寻找增广路径中最小的那条边
for i=:k
A(path(i,),path(i,))=A(path(i,),path(i,))-Mi; %增广路径中每条路径减去最小的边
maxflow(path(i,),path(i,))=maxflow(path(i,),path(i,))+Mi; %最大流,原网络包含这个网络,我只能这样表示了
end %使用新的图A进入下一循环,从新开始找增广路径
end figure;
netplot(maxflow,)

这里没有连通的路径值为0.

matlab练习程序(最大流/最小割)的更多相关文章

  1. 最大流-最小割 MAXFLOW-MINCUT ISAP

    简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...

  2. 「网络流24题」「LuoguP2774」方格取数问题(最大流 最小割

    Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于给定的方 ...

  3. 最大流&最小割 - 专题练习

    [例1][hdu5889] - 算法结合(BFS+Dinic) 题意 \(N\)个点\(M\)条路径,每条路径长度为\(1\),敌人从\(M\)节点点要进攻\(1\)节点,敌人总是选择最优路径即最短路 ...

  4. UVa11248 Frequency Hopping(最大流+最小割)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33206 [思路] 最大流最小割. 可以确定的是如果不可行需要修改的 ...

  5. HDU6582 Path【优先队列优化最短路 + dinic最大流 == 最小割】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 来源:2019 Multi-University Training Contest 1 题目大意 ...

  6. ISAP 最大流 最小割 模板

    虽然这道题用最小割没有做出来,但是这个板子还是很棒: #include<stdio.h> #include<math.h> #include<string.h> # ...

  7. Codeforces 965 枚举轮数贪心分糖果 青蛙跳石头最大流=最小割思想 trie启发式合并

    A /*#include<cstring>#include<algorithm>#include<queue>#include<vector>#incl ...

  8. 网络流 最大流—最小割 之SAP算法 详解

    首先引入几个新名词: 1.距离标号: 所谓距离标号 ,就是某个点到汇点的最少的弧的数量(即边权值为1时某个点到汇点的最短路径长度). 设点i的标号为level[i],那么如果将满足level[i]=l ...

  9. nyoj-677-最大流最小割

    677-碟战 内存限制:64MB 时间限制:2000ms 特判: No通过数:2 提交数:2 难度:4 题目描述: 知己知彼,百战不殆!在战争中如果被敌人掌握了自己的机密,失败是必然的.K国在一场战争 ...

随机推荐

  1. Qt 学习之路 2(45):模型

    Home / Qt 学习之路 2 / Qt 学习之路 2(45):模型 Qt 学习之路 2(45):模型  豆子  2013年2月26日  Qt 学习之路 2  23条评论 在前面两章的基础之上,我们 ...

  2. 洛谷 P2577 [ZJOI2005]午餐

    这道题目比较难想. 题解: 算法:贪心+dp 容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 然后就是dp了: 首先,应该想到f[i][j][k]:前i个人,在1号窗口打饭 ...

  3. P3332 [ZJOI2013]K大数查询

    传送门 注意操作 $1$ 是在区间的每个位置加入一个数,不是加上一个值 相当于每个位置维护的是一个集合 显然树套树 一开始想的是区间线段树套权值线段树 发现这样询问区间第 $K$ 大时就要先二分答案再 ...

  4. 毕业设计 python opencv实现车牌识别 码云地址

    码云地址:https://gitee.com/yinghualuowu/Python_VLPR 删除了冗余代码,可以更加便于运行.其实是为了那些进不去github准备的~

  5. Jsch初步

    [From] http://xpenxpen.iteye.com/blog/2061869 上一篇文章我们成功搭建了sshd服务器,并通过3种方式登陆上了ssh.这一篇我们将用开源jar包jsch来登 ...

  6. 经常谈到Oracle的权限,你究竟知道多少

    作者: 三十而立 时间:2009年10月28日 9:41:15 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者"inthirties(三十而立)" 接着上面谈到的 ...

  7. TOJ 3486 Divisibility

    Description On the planet Zoop, numbers are represented in base 62, using the digits 0, 1, . . . , 9 ...

  8. TOJ 2119 Tangled in Cables

    描述 You are the owner of SmallCableCo and have purchased the franchise rights for a small town. Unfor ...

  9. JS实现多少小时前,多少天前...

    最近需要实现题目的功能,因为我的时间戳是PHP生成的,所以转换JS时间戳需要乘1000,废话不多说,看下面的代码把! 大家可以判断一下传进来的值是否为数值型,还有判断是否比当前的时间戳大!可以根据结果 ...

  10. Java入门系列-07-从控制台中接收输入

    这篇文章帮你使用Scanner类从控制台接收输入 从控制台接收字符串 敲一敲: import java.util.Scanner; public class DemoScanner { public ...