最短路径问题

看了王道的视频,感觉云里雾里的,所以写这个博客来加深理解。(希望能在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. 用Java代码来校验QQ号

    校验qq号码: 1.要求必须是5-15位数字 2.0不能开头 分析: A:键盘录入一个qq号码 B:写一个功能实现校验 C:调用功能,输出结果. 代码实现:public class RegexDemo ...

  2. [nodejs] 同步/异步创建多层目录

    背景 有时项目里需要同时创建多层目录的功能,但低版本的nodejs并没有提供快捷的api 尽管在v10.12.0版本 mkdir() 第二个参数支持recursive 参数,为true时能递归创建,但 ...

  3. ApiPost如何在预执行脚本里添加请求参数?

    ApiPost V3引入了预执行脚本和后执行脚本的概念,详细可以通过链接:<ApiPost的预执行脚本和后执行脚本>了解学习更多.本文主要介绍如何在预执行脚本里增加请求参数. 使用场景 我 ...

  4. 第九次-DFA最小化,语法分析初步

    1.将DFA最小化:教材P65 第9题 2.构造以下文法相应的最小的DFA S→ 0A|1B A→ 1S|1 B→0S|0 3.自上而下语法分析,回溯产生的原因是什么? 4.P100 练习4,反复提取 ...

  5. 2019-2020-1 20199325《Linux内核原理与分析》第二周作业

    冯诺依曼计算机硬件框图: 下面是一个简单的程序example.c. intadd_a_and_b(int a,int b){returna+b;}intmain(){returnadd_a_and_b ...

  6. NumPy学习指南(第2版)

    第一章 NumPy快速入门 首先,我们将介绍如何在不同的操作系统中安装NumPy和相关软件,并给出使用NumPy的简单示例代码. 然后,我们将简单介绍IPython(一种交互式shell工具). 如前 ...

  7. Unity(GameObject)

    ####1. 这个方法用于发送一个数据到指定的方法中,第三个参数是是否强制接收 以下三种方法发送消息的形式,各有不同的效果,可以通过第一个参数指定要发送的方法名名,第二个是发送的参数值,第三个参数是是 ...

  8. CF--思维练习--CodeForces - 219C Color Stripe (思维)

    ACM思维题训练集合 A colored stripe is represented by a horizontal row of n square cells, each cell is paine ...

  9. 网络流--最大流--hlpp(预流推进)模板

    //500ms 秒掉洛谷推流问题 #include <algorithm> #include <iostream> #include <cstring> #incl ...

  10. MySQL JDBC Driver 8.0+设置服务器时区

    遇到一个问题,线下环境测试数据的查询完全没有问题,但是线上环境却没法查询出数据,并且从mybatis输出的日志来看,查询参数也没有问题,数据库中数据也是存在的,查询参数类型是java.util.Dat ...