最短路径问题

看了王道的视频,感觉云里雾里的,所以写这个博客来加深理解。(希望能在12点以前写完)

floyd算法链接在底部,也可以直接点击这个超连接

一、总体思想

dijkstra算法的主要思想就是基于贪心,找出从v开始的顶点到各个点的最短路径,做法入下

1.初始化三个辅助数组

s[],dist[],path[]

s[]:这个数组用来标记结点的访问与否,如果该结点被访问,则为1,如果该结点还没有访问,则为0;

dist[]:这个数组用来记录当前从v到各个顶点的最短路径长度,算法的核心思想就是通过不断修改这个表实现;

path[]:这个数组用来存放最短路径;

2.遍历图,修改上面的各项数组,每次只找最短路径,直到遍历结束

二、代码实现

 void dijkstra(Graph G, int v)
{
int s[G.vexnum];
int dist[G.vexnum];
int path[G.vexnum];
for(int i = ; i < G.vexnum; i++)
{
s[i] = ;
dist[i] = G.edge[v][i];
if(G.edge[v][i] == max || G.edge[v][i] == )
{
path[i] = -;
}
else
{
path[i] = v;
}
s[v] = ;
} for(int i = ; i < G.vexnum; i++)
{
int min = max;
int u;
for(int j = ; j < G.vexnum; j++)
{
if(s[j] != && dist[j] < min)
{
min = dist[j];
u = j;
}
}
s[u] = ;
for(int j = ; j < G.vexnum; j++)
{
if(s[j] != && dist[j] > dist[u] + G.edge[u][j])
{
dist[j] = dist[u] + G.edge[u][j];
path[j] = u;
}
}
}
}

三、代码解释

先自己定义一个无穷大的值max

#define max inf

dijkstra算法传入的两个参为

图Graph G;

起点结点 int v;

首先我们需要三个辅助数组

 int s[G.vexnum];//记录结点时是否被访问过,访问过为1, 没有访问过为0
int dist[G.vexnum];//记录当前的从v结点开始到各个结点的最短路径长度
int path[G.vexnum];//记录最短路径,存放的是该结点的上一个为最短路径的前驱结点

初始化三个数组

 for(int i = ; i < G.vexnum; i++)
{
s[i] = ;//目前每个结点均未被访问过,设为0
dist[i] = G.edge[v][i];//dist[]数组记录每个从v结点开到其他i结点边的长度(权值)
if(G.edge[v][i] == max || G.edge[v][i] == )
{
path[i] = -;
}//如果v到i不存在路径或者i就是v结点时,将path[i]设为-1,意为目前v结点不存在路径到i
else
{
path[i] = v;
}//反之,若v到i存在路径,则v就是i的前驱结点,将path[i] = v
s[v] = ;//从遍历起点v开始,即已经访问过顶点s[v]=1
}

开始遍历数组并且每次修改辅助数组以记录目前的情况,直至遍历结束

 for(int i = ; i < G.vexnum; i++)
{
int min = max;//声明一个min = max用来每次记录这次遍历找到的最短路径的长度(权值)
int u;//声明u来记录这次历找到的最短路径的结点
for(int j = ; j < G.vexnum; j++)//开始遍历 找目前的最短路径
{
if(s[j] != && dist[j] < min)
{
min = dist[j];
u = j;
}//找出v到结点j的最短路径,并且记录下最短路径的结点u = j
}
s[u] = ;//找到结点u,即已访问过u,s[u] = 1
for(int j = ; j < G.vexnum; j++)//开始遍历 修改辅助数组的值
{
if(s[j] != && dist[j] > dist[u] + G.edge[u][j])
{
dist[j] = dist[u] + G.edge[u][j];
path[j] = u;
}//如果v→j的路径比v →u→j长,那么修改dist[j]的值为 dist[u] + G.edge[u][j],并且修改j的前驱结点为path[j] = u
}
}

遍历结束后,数组dist[]就是存放了起点v开始到各个顶点的最短路径长度

最短路径包含的结点就在path数组中

例如我们得到如下的path[]数组

 path[] = -;//0到自己无前驱结点
path[] = ;//1的前驱为结点0,0无前驱结点,即最短路径为0 →1
path[] = ;//2的前驱结为点1,1的前驱结点0,0无前驱结点,即最短路径为0 →1 →2
path[] = ;//3的前驱为结点0,0无前驱结点,即最短路径为0 →3
path[] = ;//4的前驱结为点2,2的前驱结为点1,1的前驱结点0,0无前驱结点,即最短路径为0 →1 →2 →4

其实不难看出,每次都会标记已经访问过的节点,访问过的节点不会再更改,即 这样的算法不可逆,也就是dijkstra对于存在负权值的图不适用,明天再更新Floyd算法叭

最短路径——dijkstra算法代码(c语言)的更多相关文章

  1. 最短路径-Dijkstra算法与Floyd算法

    一.最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1    ADE:2   ADCE:3   ABCE:3 ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径 ...

  2. 最短路径——Dijkstra算法以及二叉堆优化(含证明)

    一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...

  3. 网络最短路径Dijkstra算法

    最近在学习算法,看到有人写过的这样一个算法,我决定摘抄过来作为我的学习笔记: <span style="font-size:18px;">/* * File: shor ...

  4. 带你找到五一最省的旅游路线【dijkstra算法代码实现】

    算法推导过程参见[dijkstra算法推导详解] 此文为[dijkstra算法代码实现] https://www.cnblogs.com/Halburt/p/10767389.html package ...

  5. 单源最短路径Dijkstra算法,多源最短路径Floyd算法

    1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...

  6. 数据结构实验之图论七:驴友计划 ( 最短路径 Dijkstra 算法 )

    数据结构实验之图论七:驴友计划 Time Limit: 1000 ms           Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...

  7. 有向网络(带权的有向图)的最短路径Dijkstra算法

    什么是最短路径? 单源最短路径(所谓单源最短路径就是只指定一个顶点,最短路径是指其他顶点和这个顶点之间的路径的权值的最小值) 什么是最短路径问题? 给定一带权图,图中每条边的权值是非负的,代表着两顶点 ...

  8. Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  9. 单源最短路径 dijkstra算法实现

    本文记录一下dijkstra算法的实现,图用邻接矩阵表示,假设图为无向图.而且连通,有向图,不连通图的做法相似. 算法简述: 首先确定"单源"的源.假设是第0个顶点. 维护三个数组 ...

随机推荐

  1. 数值计算方法实验之Newton 多项式插值(MATLAB代码)

    一.实验目的 在己知f(x),x∈[a,b]的表达式,但函数值不便计算或不知f(x),x∈[a,b]而又需要给出其在[a,b]上的值时,按插值原则f(xi)=yi (i=0,1,……, n)求出简单函 ...

  2. 三步教你如何在Github部署自己的简历

    相信铁子们有很多都是将找工作的小白(和小编一样!!嘿嘿)小编也和在座的大家一样,一个普通的不能再普通的二本学生(北华大学) <  单身!单身!单身!> 听很多人都说:像我们这个样子,害!放 ...

  3. 使用Idea当中的快捷键快速查看继承关系或其图表的两种方法

    一.Idea当中有两种方法可以查看继承关系 在Idea当中选中一个类,然后按Ctrl+H,可以快速查看当前所选类的继承关系,如下图: ​ 同样选中一个类,按CTRL+ALT+U,即可生成当前类的继承关 ...

  4. 一图解析MongoDB

    了解MongoDB,这一张图就够了: 版权所有,转载请注明出处.

  5. Winsock select server 与 client 示例代码

    参考 https://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancediomethod5.html ...

  6. MySQL系列(二)

    查看\创建\使用\删除 数据库 用户管理及授权实战 局域网远程连接法 查看\创建\使用\删除\清空\修改 数据库表(是否可空,默认值,主键,自增,外键) 表内容的增删改查 where条件.通配符_%. ...

  7. Java中的小数运算与精度损失

    float.double类型的问题 我们都知道,计算机是使用二进制存储数据的.而平常生活中,大多数情况下我们都是使用的十进制,因此计算机显示给我们看的内容大多数也是十进制的,这就使得很多时候数据需要在 ...

  8. Blazor WebAssembly 3.2.0 正式起飞,blazor 适合你吗?

    最近blazor更新很快,今天在官方博客上发布了Blazor WebAssembly 3.2.0 RC:https://devblogs.microsoft.com/aspnet/blazor-web ...

  9. java 接口实现关系下的多态

    2019独角兽企业重金招聘Python工程师标准>>> 多态: 父类的引用类型变量指向了子类的对象 或者 是接口类型的引用类型变量指向了接口实现类的对象. 实现关系下的多态:    ...

  10. 对话Roadstar投资人:一家自动驾驶公司之死(三) ...

    11. Roadstar 如何收场? 雷锋网:你觉得 Roadstar 造成今天这样的局面,是什么导致的? 投资人代表 1:刚才我们也数次表达了,在每个人身上,可能每个人的诉求,不能达到同步,与公司的 ...