最短路径Dijkstra算法(邻接矩阵)
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算法(邻接矩阵)的更多相关文章
- 单源最短路径Dijkstra算法,多源最短路径Floyd算法
1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...
- 最短路径-Dijkstra算法与Floyd算法
一.最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1 ADE:2 ADCE:3 ABCE:3 ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径 ...
- 有向网络(带权的有向图)的最短路径Dijkstra算法
什么是最短路径? 单源最短路径(所谓单源最短路径就是只指定一个顶点,最短路径是指其他顶点和这个顶点之间的路径的权值的最小值) 什么是最短路径问题? 给定一带权图,图中每条边的权值是非负的,代表着两顶点 ...
- 网络最短路径Dijkstra算法
最近在学习算法,看到有人写过的这样一个算法,我决定摘抄过来作为我的学习笔记: <span style="font-size:18px;">/* * File: shor ...
- 数据结构实验之图论七:驴友计划 ( 最短路径 Dijkstra 算法 )
数据结构实验之图论七:驴友计划 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...
- 最短路径——Dijkstra算法以及二叉堆优化(含证明)
一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...
- Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...
- 单源最短路径——dijkstra算法
dijkstra算法与prim算法的区别 1.先说说prim算法的思想: 众所周知,prim算法是一个最小生成树算法,它运用的是贪心原理(在这里不再证明),设置两个点集合,一个集合为要求的生成树的 ...
- 图论——最短路径 Dijkstra算法、Floyd算法
1.弗洛伊德算法(Floyd) 弗洛伊算法核心就是三重循环,M [ j ] [ k ] 表示从 j 到 k 的路径,而 i 表示当前 j 到 k 可以借助的点:红色部分表示,如果 j 到 i ,i 到 ...
随机推荐
- [转]NSIS:安装、卸载时检查程序是否正在运行
原文链接 http://www.flighty.cn/html/bushu/20110402_115.html 如果我们要安装或升级的程序正在运行,文件肯定会替换失败,以下代码可以提示用户结束正在运行 ...
- 1112 Stucked Keyboard (20 分)
1112 Stucked Keyboard (20 分) On a broken keyboard, some of the keys are always stucked. So when you ...
- 1009 Product of Polynomials (25 分)
1009 Product of Polynomials (25 分) This time, you are supposed to find A×B where A and B are two pol ...
- chronyd时间服务器同步时间配置
chrony是两个用来维持计算机系统时钟准确性的程序,这两个程序命名为chronyd和chronyc. chronyd是一个在系统后台运行的守护进程.他根据网络上其他时间服务器时间来测量本机时间的偏移 ...
- Nginx Tengine ngx_http_upstream_check_module 健康功能检测使用
该模块可以为Tengine提供主动式后端服务器健康检查的功能. 该模块在Tengine-1.4.0版本以前没有默认开启,它可以在配置编译选项的时候开启:./configure --with-http_ ...
- El中调用静态方法
最近在项目中遇到需要调用静态方法的问题,形如: <c:forEach items="beans" var="bean"> <p>总数:$ ...
- Web API 源码剖析之默认消息处理程序链之路由分发器(HttpRoutingDispatcher)
Web API 源码剖析之默认消息处理程序链-->路由分发器(HttpRoutingDispatcher) 我们在上一节讲述了默认的DefaultServer(是一个类型为HttpServer的 ...
- 【C++11新特性】 auto关键字
原文链接: http://blog.csdn.net/xiejingfa/article/details/50469045 熟悉脚本语言的人都知道,很多脚本语言都引入了“类型自动推断”技术:比如pyt ...
- python之路05
一 元组 对于元组我们可以把他看成一个不可变的列表# 元组:在()内用逗号分隔开的能够存多个值,对于元组来说列表有的一些功能它基本上都有,# 1.按索引取值(正向取+反向取):只能取# 2.切片(顾 ...
- nginx支持pathinfo的方法,亲测有效的
修改配置文件,修改特点域名的配置文件 location ~ \.php { #去掉$ root H:/PHPServer/WWW; fastcgi_pass ; fastcgi_index index ...