算法-迪杰斯特拉算法(dijkstra)-最短路径

迪杰斯特拉算法(dijkstra)-最短路径

简介:

迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

算法思想:

设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法结束),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点到S中各顶点的最短路径长度不大于从源点到U中任何顶点的最短路径长度。

算法步骤:

G={V,E}

1. 初始时令 S={V0},T=V-S={其余顶点},T中顶点对应的距离值

若存在<V0,Vi>,d(V0,Vi)为<V0,Vi>弧上的权值

若不存在<V0,Vi>,d(V0,Vi)为∞

2. 在(T)未确定的点中选取当前以得的最短路径(与S中顶点有关联边且权值最小)

3. 对其余T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值缩短,则修改此距离值

重复上述步骤2、3,直到S中包含所有顶点,即W=Vi为止

算法实例:

代码实例:

 1 #include<iostream>
 2 #include<cstring>
 3 #define INF  1000000
 4 using namespace std;
 5 const int maxn=1000;
 6 int dis[maxn],g[maxn][maxn],n;//存储最短距离,图矩阵,顶点数
 7 bool v[maxn];   //判断顶点是否访问
 8
 9 void dijkstra()
10 {
11     for(int i=1;i<=n;++i)
12     dis[i]=INF;//初始化最短距离
13     dis[1]=0;//到自身的距离为0
14     memset(v,0,sizeof v); //初始化为未访问
15    for(int i=1;i<=n;++i)
16     {
17         int mark=-1,mindis=INF;
18         for(int j=1;j<=n;++j)
19         if(!v[j]&&dis[j]<mindis)//在未确定的点中取当前以得最短路径
20         {
21             mindis=dis[j];
22             mark=j;
23         }
24         v[mark]=1;
25         for(int j=1;j<=n;++j)//更新最短路径
26         if(!v[j])
27         dis[j]=min(dis[j],dis[mark]+g[mark][j]);
28     }
29 }
30 int main()
31 {
32     int m,a,b,c;//边数,顶点a,b,权重
33 memset(g,10000,sizeof g);// 初始化图矩阵
34 memset(dis,10000,sizeof dis);// 初始化 dis矩阵
35     cin>>n>>m;
36     for(int i=0;i<m;i++)
37     {
38         cin>>a>>b>>c;
39         g[a][b]=c;
40         g[b][a]=c;
41     }
42     dijkstra();
43         for(int i=1;i<=n;i++)
44     {
45         cout<<dis[i]<<endl;
46     }
47     return 0;
48  } 

ps:无负边

ps:部分资料来源网上

时间: 2024-10-17 14:40:04

算法-迪杰斯特拉算法(dijkstra)-最短路径的相关文章

最短路径算法——迪杰斯特拉算法(Dijkstra)

图结构中应用的最多的就是最短路径的查找了,关于最短路径查找的算法主要有两种:迪杰斯特拉算法(Dijkstra)和Floyd算法. 其中迪杰斯特拉算法(Dijkstra)实现如下: 原理就是不断寻找当前的最优解: void main() { int V[Max][Max]={0,8,32,Infinity,Infinity, 12,0,16,15,Infinity, Infinity,29,0,Infinity,13, Infinity,21,Infinity,0,7, Infinity,Infi

最短路径算法——迪杰斯特拉(Dijkstra)

算法思想 设G=(V,E)是一个带权有向图 把图中顶点集合V分成两组 第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了) 第二组为其余未确定最短路径的顶点集合(用U表示) 按最短路径长度的递增次序依次把第二组的顶点加入S中 在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度 此外,每个顶点对应一个距离,S中的顶点的距离就是从源点v到此顶点的最短

图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP

文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪杰斯特拉算法 求从源点到其余各点的最短路径 依最短路径的长度递增的次序求得各条路径 路径长度最短的最短路径的特点: 在这条路径上,必定只含一条弧,并且这条弧的权值最小. 下一条路径长度次短的最短路径的特点: 它只可能有两种情况:或是直接从源点到该点(只含一条弧):或者是从源点经过顶点v1,再到达该顶

算法--迪杰斯特拉算法 Dijkstra

https: //www.bilibili.com/video/av47427754?from=search&seid=10869921304007190819 import java.util.*; public class djstl { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); // n个点 m条边 x为开始点 如1到6 1为开始点

floyd算法&amp;迪杰斯特拉算法

for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { gra[i][j]=min(gra[i][j],gra[i][k]+gra[k][j]); } void Dijkstra(int n, int v, int *dist, int *prev, int c[maxx][maxx]) { bool s[maxx]; // 判断是否已存入该点到S集合中 for(int i=1; i<=n;

图的算法--迪杰斯特拉算法

#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int maxn = 100; int map[maxn][maxn]; int dis[maxn]; int path[maxn]; int vis[maxn]; int n; void DIJ(int s) { memset(path, -1, sizeof(path)); memset(dis, 0x3f

数据结构图之三(最短路径--迪杰斯特拉算法——转载自i=i++

数据结构图之三(最短路径--迪杰斯特拉算法) [1]最短路径 最短路径?别乱想哈,其实就是字面意思,一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第一个顶点为源点,最后一个顶点为终点. 由于非内网图没有边上的权值,所谓的最短路径其实是指两顶点之间经过的边数最少的路径. 别废话了!整点实际的哈,你能很快计算出下图中由源点V0到终点V8的最短路径吗? [2]迪杰斯特拉算法 迪杰斯特拉算法是按路

最短路径之迪杰斯特拉(Dijkstra)算法

对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd)算法.本文先来讲第一种,从某个源点到其余各顶点的最短路径问题. 这是一个按路径长度递增的次序产生最短路径的算法,它的大致思路是这样的. 初始时,S中仅含有源.设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度.D

最短路径之迪杰斯特拉算法(Dijkstra)

1.迪杰斯特拉(dijkstra)算法简介 Dijkstra算法是由E.W.Dijkstra于1959年提出,又叫迪杰斯特拉算法,它应用了贪心算法模式, 是目前公认的最好的求解最短路径的方法.算法解决的是有向图中单个源点到其他顶点的最短 路径问题,其主要特点是每次迭代时选择的下一个顶点是标记点之外距离源点最近的顶点.但 由于dijkstra算法主要计算从源点到其他所有点的最短路径,所以算法的效率较低. 2.dijkstra算法基本过程 假设路网中每一个节点都有标号 是从出发点s到点t的最短路径长