Dijkstra算法的原理:

从某个源点到其余各顶点的最短路径,即单源点最短路径(仅适合非负权值图)。单源点最短路径是指:给定带权有向图G和源点v,求从v到G中其余各顶点的最短路径。迪杰斯特拉(Dijkstra)提出了按路径长度递增的顺序产生各顶点的最短路径算法。

该算法的基本思想是:

(1)设置两个顶点的集合S和T=V-S,集合S中存放已找到最短路径的顶点,集合T存放当前还未找到最短路径的顶点;

(2)初始状态时,集合S中只包含源点v0;

(3)从集合T中选取到某个顶点vi(要求vi到v0的路径长度最小)加入到S中;

(4)S中每加入一个顶点vi,都要修改顶点v0到T中剩余顶点的最短路径长度值,它们的值为原来值与新值的较小者,新值是vi的最短路径长度加上vi到该顶点的路径长度;

(5)不断重复(3)和(4),直到S包含全部顶点。

算法设计:

1.首先函数里面运用二维数组cost[n][n]实现图的临界矩阵存储,数组dist[n]表示源点到节点n的最短距离,S[n]表示某一节点n是否已经进入集合S,如果进入则将S[i]置为1,否则为0。pre[n]表示当前节点n的前驱节点(用来输出路径)。

2.在开始遍历之前,首先给数组D[n]赋值为源点到该点的距离,这样便能第一次找到源点到相邻节点的最短距离(dist[i]=cost[v][i];)。

3.下面找出最短距离:

if((!S[j])&&(dist[j]<min))
{
min=dist[j];
u=j;
}

4.更新各节点的最短距离:

for(int k=0;k<n;k++)
{
if((!S[k])&&(dist[k]>dist[u]+cost[u][k]))  //调整未加入S的点的距离值
{
D[k]=D[u]+cost[u][k];
pre[k]=u; //若通过u减小了k的距离值,则修改k的前趋为u
}
}

4.另外,若从原点无法到达顶点x,则令其前趋为-1:pre[x]=-1,在输出判别一下就可以了。还要提醒的一点是输入输出的顶点的标号与实际存储的数组下标相差为1,应该要分辨清楚。

代码实现:

#include<cstdio>
using namespace std;
#define max 10000
#define inf 20000
int n,e; //顶点数n,边的条数e
int cost[20][20]; //临界矩阵
int dist[20]; //存储最短路径的长度值
int pre[20]; //存储一个顶点在其最短路径的前趋
int S[20]; //标志数组,若为已经找到最短路径的结点则为1,否则为0 void Dijkstra(int v){
for(int i=0;i<n;i++){
dist[i]=cost[v][i]; //初始化
S[i]=0; //标志位初始为0
if(dist[i]<max)
pre[i]=v; //若存在边,则前趋为原点
else
pre[i]=-1; //否则,前趋为-1,不可达
}
S[0]=1; //原点标志为1
for(int i=0;i<n-1;i++){ //循环n-1次
int u; //u为待选顶点
int min=inf; //令初始最小值>max,使距离值为max的顶点也能加到S中
for(int j=0;j<n;j++){
if((!S[j])&&dist[j]<min){ //寻找距离S最小的顶点u
min=dist[j];
u=j;
}
}
S[u]=1; //将其标志设置为1
for(int k=0;k<n;k++){ //调整未加入S的点的的距离值
if((!S[k])&&dist[k]>dist[u]+cost[u][k]){
dist[k]=dist[u]+cost[u][k];
pre[k]=u; //若通过u减小了k的距离,则修改k的前趋为u
}
}
}
printf("\nThe result:\n"); //输出结果
for(int i=0;i<n;i++){
printf("<%d,%d>: ",v+1,i+1);
int p=pre[i];
if(p!=-1){ //若可达输出最短路径
printf("%d ",dist[i]); //输出最短距离
printf("%d",i+1); //根据前趋逆向输出最短路径
while(p!=v){
printf("<--%d",p+1);
p=pre[p];
}
printf("<--%d",v+1);
}
else{ //若不可达则输出“inf”
printf("inf");
}
printf("\n");
}
} int main(){
printf("Please enter the number of n and e:");
scanf("%d%d",&n,&e);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cost[i][j]=max; //初始化为max
int start,end,dut;
for(int i=0;i<e;i++){
scanf("%d%d%d",&start,&end,&dut); //输入边的始点,终点和权值
start--;
end--; //结点号与存储的下标相差1
cost[start][end]=dut;
}
int v=0;
Dijkstra(v); //以顶点1(即下标为0)为原点v
return 0;
}

最短路径Dijkstra算法(邻接矩阵)的更多相关文章

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

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

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

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

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

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

  4. 网络最短路径Dijkstra算法

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

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

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

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

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

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

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

  8. 单源最短路径——dijkstra算法

    dijkstra算法与prim算法的区别   1.先说说prim算法的思想: 众所周知,prim算法是一个最小生成树算法,它运用的是贪心原理(在这里不再证明),设置两个点集合,一个集合为要求的生成树的 ...

  9. 图论——最短路径 Dijkstra算法、Floyd算法

    1.弗洛伊德算法(Floyd) 弗洛伊算法核心就是三重循环,M [ j ] [ k ] 表示从 j 到 k 的路径,而 i 表示当前 j 到 k 可以借助的点:红色部分表示,如果 j 到 i ,i 到 ...

随机推荐

  1. java web程序 html标签中<th>和<td>的用法区别:

    <th>是用于表头式的 <td>是列 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional ...

  2. RDD之四:Value型Transformation算子

    处理数据类型为Value型的Transformation算子可以根据RDD变换算子的输入分区与输出分区关系分为以下几种类型: 1)输入分区与输出分区一对一型 2)输入分区与输出分区多对一型 3)输入分 ...

  3. Find substring with K distinct characters

    Given a string and number K, find the substrings of size K with K distinct characters. If no, output ...

  4. Fix-Dell iDRAC 7 error: RAC0218: The maximum number of user sessions is reached

    Hi Everyone, We came across the following error while performing some preventative maintenance check ...

  5. Linux系统运行级与启动机制剖析

    原文作者:技术成就梦想 原文链接:http://ixdba.blog.51cto.com/2895551/533740 一 系统运行级windows系统有安全运行模式和正常运行模式,这是两个不同的运行 ...

  6. python学习之----异常处理小示例

    网络是十分复杂的.网页数据格式不友好,网站服务器宕机,目标数据的标签找不到,都 是很麻烦的事情.网络数据采集最痛苦的遭遇之一,就是爬虫运行的时候你洗洗睡了,梦 想着明天一早数据就都会采集好放在数据库里 ...

  7. 框架之Tornado(简单介绍)

    引言 回想Django的部署方式 以Django为代表的python web应用部署时采用wsgi协议与服务器对接(被服务器托管),而这类服务器通常都是基于多线程的,也就是说每一个网络请求服务器都会有 ...

  8. linux双网卡绑定实现冗余与负载均衡

    1 编辑/etc/modprobe.conf   在/etc/modprobe.conf里加入如下两行: alias bond0 bonding options bond0 mode=1 miimon ...

  9. 用python登录远程salt,并执行命令

    用python操作saltstack,如果是在本地,则可以用python的salt模块,但如果要操作远程saltstack,则不行,今天就来看看怎么操作. 用python操作远程的saltstack, ...

  10. form表单提交参数封装

    function getFormValues(element,options) { var data = {}; if(element == null || element == undefined) ...