首页 > 编程语言 >算法 图论最短路径

算法 图论最短路径

时间:2024-07-20 21:00:56浏览次数:11  
标签:plot 图论 有向图 graph 路径 最短 算法 节点

零、写在前面

本文讲述Dijkstra、Bellman-Ford、Floyd-Warshall算法

一、 分类

G(graph):图

V(vertex):点

E(edge):边

一个图可以用数学语言描述为G(V(G),E(G))

W(weights):权

所以一个图也可以用数学语言描述为G(V(G),E(G),W(G))

二、作图

2.1作图网站(推荐)

 在线作图网站:图论作图网站

Graph Editor用法:

Undirected/Directed:有向图/无向图。

0-index/1-index:从0开始/从1开始。

Node Count:几个点。

Graph Data:图数据,第一位数字为点,第一位和第二位为边(有向),第三位为权。

Graph Data会影响到Node Count和Undirected/Directed,所以一般不用管Node Count和Undirected/Directed,只需要关注Graph Data和Undirected/Directed即可。

拖动图标可改变相对位置。

Force:固定

Draw:生产node、连线、

Edit:更改node和edge的数值

Delete:删除

Config:类似于设置

Download as png:生产图片

2.2MATLAB作图

无向图

% Matlab作无向图
% (1)无权重(每条边的权重默认为1)
% 函数graph(s,t):可在 s 和 t 中的对应节点之间创建边,并生成一个图
% s 和 t 都必须具有相同的元素数;这些节点必须都是从1开始的正整数,或都是字符串元胞数组。
s1 = [1,2,3,4];
t1 = [2,3,1,1];
G1 = graph(s1, t1);
plot(G1)
% 注意哦,编号最好是从1开始连续编号,不要自己随便定义编号
s1 = [1,2,3,4];
t1 = [2,3,1,1];
G1 = graph(s1, t1);
plot(G1)

% 注意字符串元胞数组是用大括号包起来的哦
s2 = {'学校','电影院','网吧','酒店'};
t2 = {'电影院','酒店','酒店','KTV'};
G2 = graph(s2, t2);
plot(G2, 'linewidth', 2)  % 设置线的宽度
% 下面的命令是在画图后不显示坐标
set( gca, 'XTick', [], 'YTick', [] );  




% (2)有权重
% 函数graph(s,t,w):可在 s 和 t 中的对应节点之间以w的权重创建边,并生成一个图
s = [1,2,3,4];
t = [2,3,1,1];
w = [3,8,9,2];
G = graph(s, t, w);
plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2) 
set( gca, 'XTick', [], 'YTick', [] );  

有向图

% Matlab作有向图
% 无权图 digraph(s,t)
s = [1,2,3,4,1];
t = [2,3,1,1,4];
G = digraph(s, t);
plot(G)
set( gca, 'XTick', [], 'YTick', [] );  




% 有权图 digraph(s,t,w)
s = [1,2,3,4];
t = [2,3,1,1];
w = [3,8,9,2];
G = digraph(s, t, w);
plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2) 
set( gca, 'XTick', [], 'YTick', [] );  

三、算法

3.1几个矩阵

3.1.1邻接矩阵

邻接矩阵即储存edge权值的矩阵,显然邻接矩阵是对称矩阵

D=\begin{bmatrix} 0&\infty&3&3\\ \infty&0&\infty&5\\ 3&\infty&0&2\\ 3&5&2&0 \end{bmatrix} 

D=\begin{bmatrix} 0&Inf & 8 & 3\\ Inf& 0 & Inf & 5\\ 8& Inf& 0 & 2\\ Inf& Inf &Inf &0 \end{bmatrix}

3.2负权回路

如果存在一个环,环上的权值之和为负数,那么这个环就称作负权环,也叫负权回路,不管什么算法都无法求解存在负权回路的图。

含有负权值的无向图都是负权回路。

一般无向图不存在负权值,出现负权值往往都在有向图中。

3.3迪杰斯特拉算法Dijkstra

两点之间的最短路径,不能处理负权重。

3.4贝尔曼福特算法Bellman-Ford

两点之间的最短路径,可处理存在负权值的有向图。

3.5弗洛伊德算法Floyd-Warshall

输出任意两点间的最短路径

四、代码

4.1两点之间的最短路径

包括Dijkstra算法和Bellman-Ford算法

[P,d] = shortestpath(G,start,end [,'Method',algorithm])

%功能:
返回图G中start节点到end节点的最短路径。

%输入参数:
%G:输入图(graph对象|digraph(有向图)对象)。
%start起始的节点。
%end目标的节点。
%[,'Method',algorithm]可选参数,表示计算最短路径的算法。一般默认为'auto',MATLAB会根据我们的图选择合适的算法。

%输出参数:
%P:最短路径经过的节点。
%d:最短路径。

%Method
%'auto'自动选择算法。
%'unweighted'广度优先算法,所有权值都为1。
%'positive'Dijkstra算法,要求所有权值均为非负数。
%'mixed'bellman-ford算法,要求图不存在负权回路。

4.2任意两点的最短路径

Floyd算法

d = distance(G [,'Method',algorithm])

D = distances(G)   %注意:该函数matlab2015b之后才有哦
D(1,2)  % 1 -> 2的最短路径
D(9,4)  % 9 -> 4的最短路径

% 找出给定范围内的所有点  nearest(G,s,d)
% 返回图形 G 中与节点 s 的距离在 d 之内的所有节点
[nodeIDs,dist] = nearest(G, 2, 10)   %注意:该函数matlab2016a之后才有哦

4.3找出给定范围内所有的点

% 找出给定范围内的所有点  nearest(G,s,d)
% 返回图形 G 中与节点 s 的距离在 d 之内的所有节点
% nodelDs是符合条件的节点
% Dist是这些节点与s的距离
[nodeIDs,dist] = nearest(G, 2, 10)   %注意:该函数matlab2016a之后才有哦

五、实例

求0到4的最小路径。

由于MATLAB中shortestpath函数需要从1开始编号,所以把每一位数字往前进一个。

除此之外,还能直接将0变为9,效果一样。

问题就变成了求从1到5的最小路径。

可得邻接矩阵为

D=\begin{bmatrix} 0 & 4 & inf & inf & inf & inf & inf & 8 & inf\\ 4 & 0 & 8 & inf & inf & inf &inf & 3 &inf \\ inf& 8& 0 & 7 &inf & 4 & inf & inf & 2\\ inf & inf& 7& 0 & 9 & 14 & inf & inf & inf\\ inf& inf& inf& 9& 0 & 10 & inf & inf &inf \\ inf& inf& 4& 14& 10 & 0 & 2 & inf & inf\\ inf& inf& inf& inf& inf& 2& 0 &6 &6 \\ inf& 3 & inf& inf& inf& inf& 6& 0 &1 \\ inf& inf& 2 & inf& inf& inf& 6& 1& 0 \end{bmatrix}

然后对着这个图,把数据保存在G(图)中,然后计算即可。

为了不出现错误,我们需要手写出G三遍,防止出现错误。

%质朴版求解1
s=[1 1 2 2 3 3 3 4 4 5 6 7 7 8];
t=[2 8 3 8 4 9 6 5 6 6 7 8 9 9];
w=[4 8 8 3 7 2 4 9 14 10 2 6 6 1];
%可以根据邻接矩阵准确获得,如果是无向图,还可以遮住对角线及其以下部分进行输入数据。
G=graph(s,t,w);
[P,d]=shortestpath(G,1,5)

%质朴版求解2
s=[1 1 2 2 3 3 3 4 4 5 6 7 7 8];
t=[2 8 3 8 4 9 6 5 6 6 7 8 9 9];
w=[4 8 8 3 7 2 4 9 14 10 2 6 6 1];
G=graph(s,t,w);
D = distance(G)
D(1,5)

%豪华版求解(包含美观的图片)
s=[1 1 2 2 3 3 3 4 4 5 6 7 7 8];
t=[2 8 3 8 4 9 6 5 6 6 7 8 9 9];
w=[4 8 8 3 7 2 4 9 14 10 2 6 6 1];
G=graph(s,t,w);
plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2) 
set( gca, 'XTick', [], 'YTick', [] );  
[P,d]=shortestpath(G,1,5)
% 在图中高亮我们的最短路径
myplot = plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2);  %首先将图赋给一个变量
highlight(myplot, P, 'EdgeColor', 'r')   %对这个变量即我们刚刚绘制的图形进行高亮处理(给边加上r红色)

标签:plot,图论,有向图,graph,路径,最短,算法,节点
From: https://blog.csdn.net/2402_84668171/article/details/140525930

相关文章

  • 蓝桥杯 算法季度赛2
    T2第一发没判最后一组后没有间隔T3WA了两发,调不出来往后看T5是线段树板子,1A了T4贺了个zfunction板子,WA了两发,调不出来剩下的题都没来得及看丑陋sol3.兽之泪II讨论选不选\(x_n\)比较好些如果讨论的是\(y_n\),在选\(y_i\)的情况下可能会选一些\(>y_i\)......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(1)结题报告1 2 8
    1001循环位移字符串哈希将a展开*2对于每个长度为len_a的序列进行一次hash存储并将其插入set中对于b进行一次哈希对于每个长度为len_a的连续子串进行一次查询点击查看代码#include<bits/stdc++.h>usingnamespacestd;//22222constintN=5e6+10;constintp1......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(1)
    发挥相当差,最好笑的是1h没写出一个三维偏序、30min没写出一个字符串哈希。甚至1h没意识到组合数式子推错了。A我写了点阴间东西。假设模式串为ABC,考虑一个形如ABCABCABC的东西,如果长度是\(x\),会贡献\(x-n+1\)个子串。枚举\(i\),从\(i\)把\(T\)分成两部分,一部分......
  • 字符串算法之一:朴素算法找子串
    publicclassStringAlgorithm{publicstaticvoidmain(String[]args){intresult=plainFindSubStr("12345","1234");System.out.println(result);}/***@paramstr*@parampattern*@retu......
  • 代码随想录算法训练营第33天 | 贪心4:452. 用最少数量的箭引爆气球、435. 无重叠区间
    代码随想录算法训练营第33天|贪心4:452.用最少数量的箭引爆气球、435.无重叠区间、763.划分字母区间452.用最少数量的箭引爆气球https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/代码随想录https://programmercarl.com/0452.用最......
  • 代码随想录算法训练营第31天 | 贪心3:134.加油站、135.分发糖果、860.柠檬水找零、406.
    代码随想录算法训练营第31天|贪心3:134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列134.加油站https://leetcode.cn/problems/gas-station/description/代码随想录https://programmercarl.com/0134.加油站.html135.分发糖果https://leetcode.cn/problems......
  • 算法基础课第一章(中)高精度+前缀和+差分
    一、高精度(一)使用高精度的原因在计算机中处理非常大或非常小的数值时,确保计算结果的精确性和准确性。在特定情况下,可以自己实现高精度计算的数据结构和算法,例如使用字符串或数组来表示大数,并实现基本的加、减、乘、除操作。(二)高精度加法1、方法(1)描述:从最低位开始加法计算......
  • 【数据结构初阶】顺序表三道经典算法题(详解+图例)
    Hello!很高兴又见到你了~~~看看今天要学点什么来充实大脑吧——目录1、移除元素【思路+图解】 【总结】2、删除有序数组中的重复项【思路+图解】【总结】3、合并两个有序数组【思路+图解】【总结】 至此结束,ShowTime!1、移除元素【思路+图解】 ......
  • 【2024-ZR-C Day 4】图论(1)
    1.强连通分量1.1.定义在有向图中,选取一个点集\(S\),若对于\(S\)中的任意两点\(u,v\),都满足\(u\)可以到达\(v\),则称\(S\)是强连通的。强连通分量是图中一个极大的强连通的点集。性质:把一个有向图通过强连通分量缩点后,新的图是一个DAG.1.2.Kosaraju算法在无向图......
  • 零基础,快速学YOLO目标检查算法(YOLO—v1,2,3快速学习)
    一.深度学习经典检测方法1.two-stage(两阶段):Faster-rcnnMask-Rcnn系列,先有预选,预选完之后再通过预选得到最终结果。速度通常较慢,但效果不错2.one-stage(单阶段):YOLO系列,普通回归任务。最核心的优势,速度非常快,适合做实时检测任务,但效果通常情况不会太好二.指标分析map指标......