matlab练习程序(最大流/最小割)
学习这个算法是为学习图像处理中的图割算法做准备的。
基本概念:
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练习程序(最大流/最小割)的更多相关文章
- 最大流-最小割 MAXFLOW-MINCUT ISAP
简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...
- 「网络流24题」「LuoguP2774」方格取数问题(最大流 最小割
Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于给定的方 ...
- 最大流&最小割 - 专题练习
[例1][hdu5889] - 算法结合(BFS+Dinic) 题意 \(N\)个点\(M\)条路径,每条路径长度为\(1\),敌人从\(M\)节点点要进攻\(1\)节点,敌人总是选择最优路径即最短路 ...
- UVa11248 Frequency Hopping(最大流+最小割)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33206 [思路] 最大流最小割. 可以确定的是如果不可行需要修改的 ...
- HDU6582 Path【优先队列优化最短路 + dinic最大流 == 最小割】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 来源:2019 Multi-University Training Contest 1 题目大意 ...
- ISAP 最大流 最小割 模板
虽然这道题用最小割没有做出来,但是这个板子还是很棒: #include<stdio.h> #include<math.h> #include<string.h> # ...
- Codeforces 965 枚举轮数贪心分糖果 青蛙跳石头最大流=最小割思想 trie启发式合并
A /*#include<cstring>#include<algorithm>#include<queue>#include<vector>#incl ...
- 网络流 最大流—最小割 之SAP算法 详解
首先引入几个新名词: 1.距离标号: 所谓距离标号 ,就是某个点到汇点的最少的弧的数量(即边权值为1时某个点到汇点的最短路径长度). 设点i的标号为level[i],那么如果将满足level[i]=l ...
- nyoj-677-最大流最小割
677-碟战 内存限制:64MB 时间限制:2000ms 特判: No通过数:2 提交数:2 难度:4 题目描述: 知己知彼,百战不殆!在战争中如果被敌人掌握了自己的机密,失败是必然的.K国在一场战争 ...
随机推荐
- 【转】IntelliJ Idea取消Could not autowire. No beans of 'xxxx' type found的错误提示
1.问题描述 在Idea的spring工程里,经常会遇到Could not autowire. No beans of 'xxxx' type found的错误提示.但程序的编译和运行都是没有问题的, ...
- class __init__()
python 先定义函数才能调用 类是客观对象在人脑中的主观映射,生产对象的模板,类相当于盖房的图纸,生产工具的模具 模板 类:属性.方法 __init__() 这个方法一般用于初始化一个类但是 当实 ...
- PHP 生成随机数组
/** 生成指定个数,以及最小最大值随机数组(包括最大值) * @parem $min 随机数组最小值 * @parem $max 随机数组最大值 * @parem $num 随机数组个数,默认max ...
- abp使用redis缓存
利用NuGet程序包管理程序,添加 Abp.RedisCache 在 xxxx.Web.Core 项目的Module中注册Redis 在刚才上面这个类文件头部注册Redis组件 在Web.config ...
- 洛谷 P2048 BZOJ 2006 [NOI2010]超级钢琴
题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中A ...
- Fliptile (dfs+二进制压缩)
Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He ha ...
- 【研究】缓慢的http拒绝服务攻击
1 详细描述: 缓慢的http拒绝服务攻击是一种专门针对于Web的应用层拒绝服务攻击,攻击者操纵网络上的肉鸡,对目标Web服务器进行海量http request攻击,直到服务器带宽被打满,造成了拒绝服 ...
- Angular4+NodeJs+MySQL 入门-06 接口配置
在上篇中说了怎么调用接口,这篇就来说说,接口配置吧. 后端是用NodeJS来写的,由于写后台(以前用的是C#语言)的时候,大部操作都在是对数据库表的增.删.改.查操作, 比如:根据查询出来的数据,然后 ...
- pulic——功能性(自己写完测试的)
一. 构建一个数组[“00:00”,"00:05"..."23:55"]的数组 function buildAxis(){ var ary=[]; ary.pu ...
- 如何给MySql创建连接用户并授权
一般在为MySql创建用户时建议使用GRANT前台命令,当然如果对我们开发者而言,方法还有很多种,比如使用INSERT命令,甚至是直接修改mysql user数据表,但仍然建议按照MySQL规范去授权 ...