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

基本概念:

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. linux安装PHP7以及扩展

    Linux下安装PHP7 事先升级gcc4.8,然后安装PHP7,安装步骤参考:CentOS安装PHP7 1.Linux下编译的php没有php.ini 解决办法:从源代码目录中复制php.ini-d ...

  2. Oracle中对XMLType的简单操作(extract、extractvalue)

    前几天一直在做Oracle对XMLType字段的操作,我还不是Oracle大拿,到网上找了很多资料,但是很多就是单一功能的介绍,不能很好的解决问题,现在在这里总结下. 1.下面先创建一个名未test. ...

  3. 下厨房---map/字符串查询

    题目描述 牛牛想尝试一些新的料理,每个料理需要一些不同的材料,问完成所有的料理需要准备多少种不同的材料. 输入描述: 每个输入包含 1 个测试用例.每个测试用例的第 i 行,表示完成第 i 件料理需要 ...

  4. PIE SDK正射校正

    1. 算法功能简介 正射校正是对影像空间和几何畸变进行校正生成多中心投影平面正射图像的处理过程.它除了能纠正一般系统因素产生的几何畸变外,还可以消除地形引起的几何畸变 PIE支持算法功能的执行,下面对 ...

  5. 设计模式学习总结(七)适配器模式(Adapter)

    适配器模式主要是通过适配器来实现接口的统一,如要实现国内手机在国外充电,则需要在不同的国家采用不同的适配器来进行兼容! 一.示例展示: 以下例子主要通过给笔记本电脑添加类似手机打电话和发短信的功能来详 ...

  6. 利用paramiko的demo_simple.py进行日志记录时遇到的特殊字符

    特殊字符列表: 回车 "\r" "\x13" 响铃 "\x07" 换行 "\n" "\x10" &q ...

  7. (转)远程SSH连接服务与基本排错

    远程SSH连接服务与基本排错 原文:https://www.cnblogs.com/chensiqiqi/p/6224474.html#top 1.1 为什么要远程连接Linux系统 在实际的工作场景 ...

  8. Android中改变Activity的不同icon:activity-alias

    Android设置title中的Icon有几种方法,介绍如下: 一种是直接在AndroidManifest.xml文件中设置android:icon属性,这种方法简单有效,应该算是我们最常用的设置Ic ...

  9. java线程中的 sleep() wait() yield()

    sleep()方法是让线程休眠  可以指定时间  其实就是让线程进入阻塞状态  指定的时间过后 进入就绪状态  不释锁 相当于抱着锁睡觉 wait()  让线程进入等待状态  被唤醒后才会继续执行   ...

  10. js录制视频并保存

    使用webAPI录制视频 经测试, 只在谷歌和火狐浏览器里起效. 代码: const streamVideo = document.querySelector('.stream') const pla ...