使用邻接矩阵表示有向图或无向图,对其进行最小路径的查询以及权值计算

采用递归算法,首先定义输入参数有 邻接矩阵、起始点、终止点、已走完的路长、当前已知最小路长;

function [result, path] = OptimalPath(A, v1, v2, total, op)

首次进入函数内部,会默认顶点与终止点的长度为最优长度,最优路径为当前顶点。即

%先将两点直达路径设为最优解
optimal = A(v1, v2);
path = v1;

随后会判断已走完的路长加上当前最优路长的值,是否会小于已知最优路长,若小于,则更换掉已知最优路长。其目的在于每次进入函数都会保证已知最优路长的更新来辅助下方操作。

if op >= total + optimal%若已知最优解小于已经走完的长度和当前顶点到终点的假设最优解之和,便更换已知最优解op = total +optimal;
end

作完上述工作,边开始对起始点的每条出度边进行遍历,遍历条件首先要满足:

  • 遍历的那条路径权值要小于当前顶点到终点的直达距离
  • 若发现要遍历的下一点就是终点,自动跳过,原因在于之前optimal已经得到了当前点到终点的距离,只要把该距离返回就好,无需再进入递归
  • 若发现要遍历的下一点就是自己,自动跳过,否则会死递归
  • 满足上述条件后,再次判断即将要通过的下一条路径长度与已走完路径长度之和是否大于已知最优解,若大于就没必要进入递归了

上次递归结束,就会把结果与当前的路径长度和位置相加,若相加后的结果小于该点到终点的直达长度,就将optimal = res,同时把路径也进行替换

其中optimal是要作为结果返回的,目的就在于充当一个临时值和与辅助已知最优解op的计算

for i = 1: size(A, 1)%遍历以v1为起点的所有邻边,试图找到间接进入v2的最优解if A(v1, i) < optimal && i ~= v2 && i ~= v1total = total + A(v1, i);%A(v1, i)为即将要走的一条边if total > op%若下一条边走完后总长度大于已知最优解,则不走下一条边continue;endA(i, v1) = inf;%防止进入递归引起死递归[res, pa] = OptimalPath(A, i, v2, total, op);%一旦有比最优解小的边就进入递归res = res + A(v1, i);pa = [v1, pa];if res < optimaloptimal = res;path = pa;endend
end

测试

function [result, path] = OptimalPath(A, v1, v2, total, op)
%A为输入的邻接矩阵,计算v1到v2的最短路径, num为A(v1, v2)的值
%num1为已经走完的长度,num2为已知最优解%首先判断矩阵是否为方阵
if size(A, 1) ~= size(A, 2)result = 0;disp("输入矩阵有误");return;
end
%先将两点直达路径设为最优解
optimal = A(v1, v2);
path = v1;
if op >= total + optimal%若已知最优解小于已经走完的长度和当前顶点到终点的假设最优解之和,便更换已知最优解op = total +optimal;
end
for i = 1: size(A, 1)%遍历以v1为起点的所有邻边,试图找到间接进入v2的最优解if A(v1, i) < optimal && i ~= v2 && i ~= v1total = total + A(v1, i);%A(v1, i)为即将要走的一条边if total > op%若下一条边走完后总长度大于已知最优解,则不走下一条边continue;endA(i, v1) = inf;%防止进入递归引起死递归[res, pa] = OptimalPath(A, i, v2, total, op);%一旦有比最优解小的边就进入递归res = res + A(v1, i);pa = [v1, pa];if res < optimaloptimal = res;path = pa;endend
end
result = optimal;
return;
end

输入

clear
clc
A = [0 3 inf inf 4 7;3 0 4 inf inf 1;inf 4 0 1 2 2;inf inf 1 0 inf 3;4 inf 2 inf 0 inf;7 1 2 3 inf 0];
[res, path] = OptimalPath(A, 1, 4, 0, A(1, 4))

MatLab图的最小路径(邻接矩阵表示)相关推荐

  1. 【网络流24题】D、魔术球问题(有向无环图的最小路径覆盖、思维)

    D.魔术球问题(有向无环图的最小路径覆盖.思维)[省选/NOI- ] P2765 魔术球问题 [问题分析] 枚举答案转化为判定性问题,然后最小路径覆盖,可以转化成二分图最大匹配,从而用最大流解决. [ ...

  2. The King’s Problem(tarjan求强连通分量缩点+匈牙利求有向无环图的最小路径覆盖)

    Link:http://acm.hdu.edu.cn/showproblem.php?pid=3861 The King's Problem Time Limit: 2000/1000 MS (Jav ...

  3. 有上下界网络流 ---- P4843 清理雪道(DAG图上最小路径重复边覆盖)【模板】有源汇上下界最小流

    题目链接 题目大意: 解题思路: 首先我们发现对于每条边至少要覆盖一次,最多覆盖无数次 那么就有点像上下界网络流了[1,INF][1,INF][1,INF]的限制关系 跑一边最小流就可以了!! #in ...

  4. 网络流24题——魔术球问题(有向无环图最小路径覆盖)

    链接:https://www.oj.swust.edu.cn/oj/problem/show/1739 分析: 有向无环图最小路径覆盖:给定有向无环图,求一个路径划分,使得每个点在且只在一条路径上,路 ...

  5. HDU 3861 The King’s Problem (强连通缩点+DAG最小路径覆盖)

    <题目链接> 题目大意: 一个有向图,让你按规则划分区域,要求划分的区域数最少. 规则如下:1.所有点只能属于一块区域:2,如果两点相互可达,则这两点必然要属于同一区域:3,区域内任意两点 ...

  6. hiho 第118周 网络流四·最小路径覆盖

    描述 国庆期间正是旅游和游玩的高峰期. 小Hi和小Ho的学习小组为了研究课题,决定趁此机会派出若干个调查团去沿途查看一下H市内各个景点的游客情况. H市一共有N个旅游景点(编号1..N),由M条单向游 ...

  7. (hdu step 6.3.3)Air Raid(最小路径覆盖:求用最少边把全部的顶点都覆盖)

    题目: Air Raid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  8. Acwing.379 捉迷藏(最小路径重复点覆盖)

    传送门 1.前置知识 1.最小路径点覆盖 DAG中选出最小数量的不相交路径(无公共点),将所有点覆盖. 求法:将DAG中的点拆成出点和入点,构成一个二分图. 则原图的最小路径点覆盖转化到新图中: 1. ...

  9. 一个aov网用邻接矩阵表示_图习题及参考答案

    第7章习题 一.单项选择题 1.在无向图中定义顶点的度为与它相关联的()的数目. A. 顶点 B. 边 C. 权 D. 权值 2.在无向图中定义顶点 v i与v j之间的路径为从v i到达v j的一个 ...

最新文章

  1. 【c语言】蓝桥杯算法提高 Quadratic Equation
  2. juc java_深入理解JUC(java.util.concurrent)
  3. 【必读】2019年深度学习自然语言处理最新十大发展趋势, 附报告下载
  4. Java多线程(一)之volatile深入分析
  5. Java字节码反编译工具
  6. Asp.Net MVC项目通过Git同步到新开发设备上后无法作为网站启动
  7. ASP.NET MVC 入门1、简介
  8. android Instrumentation 转载
  9. android studio快捷键与Eclipse快捷键对比-没有之一
  10. zookeeper系列(三)zookeeper的使用--开源客户端
  11. 软件测试(测试用例)—写用例无压力
  12. 如何采用SMW0存储模板和OLED操作Excel的方式生成Excel单据
  13. qq悄悄话查看器-分析报告
  14. a4纸尺寸在html中是多大,a4纸尺寸是多少厘米(各种标准纸张大小)
  15. 简单实用的vue常用后台管理模板框架
  16. 联通大数据应用及沃云平台支撑能力
  17. 网络监控系统安装的六种传输方式
  18. python-函数的递归
  19. 安卓手机管理_Mac上的安卓手机管理工具:HandShaker for mac
  20. 北京内推 | 中科院自动化所招聘机器视觉感知与理解算法工程师/实习生

热门文章

  1. python二维列表创建与循环嵌套赋值
  2. 如何建立编程思想和提高编程思想
  3. 江苏自考计算机免考与论文答辩,江苏自考毕业答辩一年有几次?答辩难吗?
  4. 妹子的笔记本开机出现SetUp Confirmation 交给我处理...
  5. 学会“放弃与妥协”,学会“自我牺牲”,学会“善待痛苦”
  6. 找不到所选字体 “Cascadia Mono“。 改为选择 “Consolas“。教程
  7. Mybatis参数传递5种方式
  8. float, double 的表示范围和精度
  9. wince6安装第三方输入法
  10. 《升职,凭什么是你:内卷时代快速升职法则》读书笔记