[matlab] 22.matlab图论实例 最短路问题与最小生成树 (转载)
最短路问题之 Floyd
某公司在六个城市 c1c1,c2c2,….,c6c6 中有分公司,从 cici 到 cjcj 的直接航程票价记在下述矩阵的 (ii,jj) 位置上。 (∞∞表示无直接航路),请帮助该公司设计一张城市 c1c1 到其它城市间的票价便宜的路线图。
变量解释:
- n 是公司个数
- a 存储航路票价,最后结束循环存储的是最便宜票价
- path 存储每对顶点之间最短路径上所经过的定点的序号,也就是”中转站”序号
clear;clc;
n = 6;
a = [0 50 inf 40 25 10;
0 0 15 20 inf 25;
0 0 0 10 20 inf;
0 0 0 0 10 25;
0 0 0 0 0 55;
0 0 0 0 0 0]; % 由于 a 是无向图,航路票价沿着正对角线对称,可以只写出右上角
a = a + a'; % 由于票价沿正对角线对称,即完整的 a 为 a + a 的转置
path = zeros(6); % 定义 path 为 6 x 6 的矩阵
for k = 1:n
for i = 1:n
for j = 1:n
if a(i,j) > a(i,k) + a(k,j)
% 如果从 i 城市到 j 城市的票价大于从 i 城市到 k,再从 k 到 j 城,那么 i 到 j 城肯定不是最短路径
a(i,j) = a(i,k) + a(k,j); % 更新 i 到 j 的最少票价
path(i,j) = k; % 同时记录下 i 到 j 的"中转站"
% 注意下一次更新会覆盖上一次 path(i,j) 存储的,所以其实 path(i,j)中存储的 只是最后一个 "中转站"
end
end
end
end
a,path
Floyd 算法
最短路问题之 dijkstra 算法
变量解释:
- n 是公司个数
- m 存储票价
- pb 存放标号信息,当 pb(ii) = 1,当前第 ii 节点已标号,否则为 0 未标号
- d 表示最短通路的值
- path 存储每对顶点之间最短路径上所经过的定点的序号
- tb 表示当前未标记的点的矩阵
- fb 表示当前已标记的点的矩阵
- min 求最小值之前的预设值
- lastpoint 暂存当前选定的一个已标记点
- newpoint 暂存当前选定的一个未标记点
- plus 即已知点到未知点距离
clear;clc;
n = 6;
m = [0 50 inf 40 25 10;
0 0 15 20 inf 25;
0 0 0 10 20 inf;
0 0 0 0 10 25;
0 0 0 0 0 55;
0 0 0 0 0 0];
m = m + m';
pb(1:length(m))= 0; % 将所有未标记点置 0
pb(1) = 1; % 选择第 1 个点标记
d(1:length(m))=0; % 将全部最短距离置 0
path(1:length(m))=0; % 将全部"中转站"置 0
while sum(pb) < 6 % 当状态不全为 1(即未标记全部点时)
tb = find(pb==0); % 找到未标记的点的矩阵
fb = find(pb==1); % 找到已标记的点的矩阵
min = 1000000;
lastpoint =1;
newpoint =1;
% 从每一个已标记点,到每一个未标记点
for i=1:length(fb)
for j=1:length(tb)
plus = d(fb(i)) + m(fb(i),tb(j)); % 计算点之间的距离
if min > plus
min = plus; % 更新最小值
lastpoint = fb(i); % 记录当前最小值下已标记点
newpoint = tb(j); % 记录当前最小值下未标记点
end
end
end
d(newpoint) = min; % 更新最终的最小值
pb(newpoint) = 1; % 更新当前未标记点状态(未标记——》标记)
path(newpoint) = lastpoint; % 更新当前点上一个点
end
d,path
dijkstra 算法
最小生成树问题之prim
变量解释:
- n 顶点个数
- a 存储图
- result 第一、二、三行分别表示生成树边的起点、终点、权集合
- p 存放图的最小生成树中的顶点
- tb 存放当前未选择的顶点
- temp 存放当前最小生成树连通的所有边
- d 存放最小的边值
- jb 存放最小的边值中已经选作最小生成树的点的矩阵(也许不止一个)
- kb 存放最小的边值中未选作最小生成树的点的矩阵(也许不止一个)
- j 确定已经选作最小生成树的点的矩阵中的第一个点
- k 确定未被选作最小生成树的点的矩阵中的第一个点
clear;
clc;
n = 7;
a = [0 50 60 inf inf inf inf;
0 0 inf 65 40 inf inf;
0 0 0 52 inf inf 45;
0 0 0 0 50 30 42;
0 0 0 0 0 70 inf;
0 0 0 0 0 0 inf;
0 0 0 0 0 0 0];% 由于 a 是无向图,航路票价沿着正对角线对称,可以只写出右上角
a = a + a'; % 由于票价沿正对角线对称,即完整的 a 为 a + a 的转置
result =[]; % 定义出 result
p =1; % 当前只有第 1 个点为最小生成树的节点
tb =2:n; % 当前未作为最小生成树的节点
while length(result) ~= n - 1 % 当生成树的边为 节点数-1 时,即最小生成树生成(n个点 n-1 条边)
temp = a(p,tb); % 存放当前最小生成树连通的所有边,用来求最短边
temp = temp(:); % 将 temp 转化成 1 列,让求出的最短距离只有一个值
d = min(temp); % 求出最短距离
[jb,kb] = find(a(p,tb)==d); % 根据最短距离,找出哪些点符合最短距离的情况
j = p(jb(1)); % 从当前最小生成树中的点中
k = tb(kb(1)); % 和当前未进入最小生成树的点中挑出第一个点
result = [result,[j;k;d]]; % 表示生成树边的起点、终点、权集合
p = [p,k]; % 刚刚选的点进入最小生成树
tb(find(tb==k)) =[]; % 将进入最小生成树的点剔除掉
end
result
prim 算法
最小生成树问题之kruskal (待补充)
[matlab] 22.matlab图论实例 最短路问题与最小生成树 (转载)的更多相关文章
- MATLAB神经网络原理与实例精解视频教程
教程内容:<MATLAB神经网络原理与实例精解>随书附带源程序.rar9.随机神经网络.rar8.反馈神经网络.rar7.自组织竞争神经网络.rar6.径向基函数网络.rar5.BP神经网 ...
- C语言与MATLAB接口 编程与实例 李传军编着
罗列一下以前自己学习C语言与MATLAB混编的笔记,顺便复习一遍. <C语言与MATLAB接口 编程与实例 李传军编着>(未看完,目前看到P106) 目录P4-8 ************ ...
- matlab load函数用法 实例
一 语法: load(filename) load(filename,variables) load(filename,'-ascii') load(filename,'-mat') load(fil ...
- matlab绘制实用日历实例代码
function TheStudy;%函数名 close all;%关闭所有床头 DD={'Sun','Mon','Tue','Wed','Thu','Fri','Sat'};%日历表头文字 figu ...
- matlab文件读写处理实例(三)——读取文件特定行
(1) 读取文件特定行 CODE: ; ; if nline==line fprintf(fidout,'%s\n',tline); data ...
- matlab文件读写处理实例(二)——textread批量读取文件
问题:对文件夹下所有文件进行批量读取,跳过文件头部分,读取每个文件数据部分的7,8,9列,保存到变量并且输出到文件. 数据: 文件夹11m\
- matlab文件读写处理实例(一)——不规则文件读取
数据: A) Title: Income Data B) Relevant Information: Marketing Database. Source: Impact Resources, Inc ...
- Matlab 编程简介与实例
函数作图 二维平面曲线作图函数 plot(x, y, 's') x, y是长度相同的向量,s表示线型和颜色 如果作多条曲线在同一图上,则用函数: plot(x1, y1, 's1', x2, y2, ...
- [Matlab]三维曲面绘制实例
[x,y] = meshgrid(-8:0.5:8); z = sin(sqrt(x.^2+y.^2))./sqrt(x.^2+y.^2+eps); subplot(2,2,1); mesh(x,y, ...
随机推荐
- Eclipse中提示svn: is already locked的解决办法
eclipse的svn提交不了,报错.提示 svn: is already locked 解决办法:右键项目-------Team------Refresh/Cleanup
- github 遇到的问题
目录 1.遇到的问题关联远程仓库,操作顺序如下:2.解决方法3.git merge 与 git rebase4.git pull 与 git pull --rebase5.更多参考 博客逐步迁移至 极 ...
- idea代码提示
idea代码提示:Keymap-->Main menu-->Code-->Completion去掉Cyclic Expand Word的快捷键将Basic的快捷键更改为Alt+/
- laravel框架详解
一.基础篇 1.概念 Laravel是一个有着美好前景的年轻框架,它的社区充满着活力,同时提供了完整而清晰的文档,而且为快速.安全地开发现代应用提供了必要的功能.2011年,Taylor Otwell ...
- nginx比apache处理静态文件速度快,但是nginx处理大量并发的php请求时,容易出现502错误,频率大概是多少
首先要明确一点的是502是怎么出现的,为什么会出现502呢? 一般而言,出现502的错误是因为php-cgi连接数不够导致的.举个例子:php-cgi开10个进程,前端发20个请求,每个请求的脚本都s ...
- Html中的img标签 加载失败
在Http请求时,有时会遇到img图片标签加载失败,不显示的情况: 解决方法,在重新给src属性赋值时,先将onerror事件清除掉,再赋值,这样就不会存在循环调用问题了,代码如下; <img ...
- loj#6032. 「雅礼集训 2017 Day2」水箱(并查集 贪心 扫描线)
题意 链接 Sol 神仙题+神仙做法%%%%%%%% 我再来复述一遍.. 首先按照\(y\)坐标排序,然后维护一个扫描线从低处往高处考虑. 一个连通块的内状态使用两个变量即可维护\(ans\)表示联通 ...
- AIDL基本使用
1.概述 Binder能干什么?Binder可以提供系统中任何程序都可以访问的全局服务.这个功能当然是任何系统都应该提供的,下面我们简单看一下Android的Binder的框架 Android Bin ...
- springboot 学习之路 7(静态页面自动生效问题)
目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...
- vue缓存页面
vue如何和ionic的缓存机制一样,可以缓存页面,在A页面跳转至B页面后返回A页面时A页面的数据还在? 在app.vue中将router-view使用keep-alive包起来,使用v-if来判断使 ...