`
BlogDown
  • 浏览: 213853 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

贪心算法——单源最短路径 dijkstra 收藏

 
阅读更多


关于单源最短路径的问题非常典型,这里没有给出分析与证明,仅仅给出了实现。

需要指出的是,许多实现仅给出了最短路径的长度,而没有给出“最短路径”,这里用给出了实现。

如程序中那样,定义一个数组p[N],其中p[i]代表“起始点v到顶点i的最短路径中,除i本身的最后一个顶点”,即着这条路径上i的前驱顶点,这个顶点随着“更多顶点的最短路径被求出”这个过程而变化。

当求出v到所有顶点的最短路径以后,同时也求出了最终的p[N]。于是可以按下列回溯的方法来求出每条最短路径序列:

对于顶点j,在其最短路径上其前驱pre = p[j],i=<pre<n且pre!=j,说明“到顶点j的最短路径”是基于“到顶点pre的最短路径”的,这样一直回溯,直到pre=v(单源点),这些pre值就构成了最短路径序列。

view plaincopy to clipboardprint?
1 #include <iostream>
2 using namespace std;
3 #define N 5
4 #define MAX 65535
5 int g[N][N];
6 void min_path(int v,long *d,int *p)
7 {
8 int i = 0;
9 int j = 0;
10 bool s[N]={false};
11 for(i=0;i<N;i++)
12 for(j=0;j<N;j++)
13 if(g[i][j] == -1)
14 g[i][j] = 65536;
15 for(i = 0;i<N;i++)
16 {
17 d[i] = g[v][i];
18 if(d[i] == MAX)
19 p[i] = 0;
20 else
21 p[i] = v;
22 }
23
24 s[v] = true;
25 d[v] = 0;
26 p[v] = 0;
27
28 int k = 0;
29 for(i = 0 ;i<N;i++)
30 {
31 int min = 65535;
32 for(j = 0 ;j<N;j++)
33 {
34 if(j != v && s[j] == false)
35 {
36 if(d[j]<=min)
37 {
38 min = d[j];
39 k = j;//k是V集合中具有最短“特殊路径的顶点”,所谓特殊路径即是从顶点v到k只经过U中的顶
点。
40 }
41 }
42 }
43 s[k] = true;//将k从V集合中并入到U集合中
44 for(j=0;j<N;j++)
45 {
46 if(s[j]==false && d[j]>d[k]+g[k][j])
47 {
48 d[j] = d[k] + g[k][j];//更新其他在V中的顶点的最短距离。
49 p[j] = k;
50 }
51 }
52 }
53 }
54 int main()
55 {
56 long d[N];
57 int p[N];//p[i]代表到达顶点i的最短路径的前驱节点,随着路径变化而变化
58 int i = 0;
59 for(i = 0;i<N;i++)
60 {
61 for(int j = 0;j<N;j++)
62 cin>>g[i][j];
63 }
64 min_path(0,d,p);
65 for( i =0;i<N;i++)
66 cout << d[i] << " ";
67 cout << endl;
68 //输出每条最短路径
69 for(i = 0;i<N;i++)
70 {
71 //if(i != 0)
72 {
73 int pre = p[i];
74 while(pre!=0)
75 {
76 cout << pre << " ";
77 pre = p[pre];
78 }
79 cout << endl;
80 }
81 }
82 }
1 #include <iostream>
2 using namespace std;
3 #define N 5
4 #define MAX 65535
5 int g[N][N];
6 void min_path(int v,long *d,int *p)
7 {
8 int i = 0;
9 int j = 0;
10 bool s[N]={false};
11 for(i=0;i<N;i++)
12 for(j=0;j<N;j++)
13 if(g[i][j] == -1)
14 g[i][j] = 65536;
15 for(i = 0;i<N;i++)
16 {
17 d[i] = g[v][i];
18 if(d[i] == MAX)
19 p[i] = 0;
20 else
21 p[i] = v;
22 }
23
24 s[v] = true;
25 d[v] = 0;
26 p[v] = 0;
27
28 int k = 0;
29 for(i = 0 ;i<N;i++)
30 {
31 int min = 65535;
32 for(j = 0 ;j<N;j++)
33 {
34 if(j != v && s[j] == false)
35 {
36 if(d[j]<=min)
37 {
38 min = d[j];
39 k = j;//k是V集合中具有最短“特殊路径的顶点”,所谓特殊路径即是从顶点v到k只经过U中的顶
点。
40 }
41 }
42 }
43 s[k] = true;//将k从V集合中并入到U集合中
44 for(j=0;j<N;j++)
45 {
46 if(s[j]==false && d[j]>d[k]+g[k][j])
47 {
48 d[j] = d[k] + g[k][j];//更新其他在V中的顶点的最短距离。
49 p[j] = k;
50 }
51 }
52 }
53 }
54 int main()
55 {
56 long d[N];
57 int p[N];//p[i]代表到达顶点i的最短路径的前驱节点,随着路径变化而变化
58 int i = 0;
59 for(i = 0;i<N;i++)
60 {
61 for(int j = 0;j<N;j++)
62 cin>>g[i][j];
63 }
64 min_path(0,d,p);
65 for( i =0;i<N;i++)
66 cout << d[i] << " ";
67 cout << endl;
68 //输出每条最短路径
69 for(i = 0;i<N;i++)
70 {
71 //if(i != 0)
72 {
73 int pre = p[i];
74 while(pre!=0)
75 {
76 cout << pre << " ";
77 pre = p[pre];
78 }
79 cout << endl;
80 }
81 }
82 }

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/clearriver/archive/2009/05/31/4229012.aspx

分享到:
评论

相关推荐

    贪心算法 Dijkstra 单源最短路径

    用C++实现的贪心算法 Dijkstra 单源最短路径,并包含大量的注释,对理解程序很有帮助

    贪心算法——最短路径算法

    算法这么课程的结课论文,以最短路径算法为例描述贪心算法

    最短路径 Dijkstra算法C语言实现

    本设计以VC++6.0作为程序开发环境,C语言作为程序开发语言,详细介绍了最短路径的求解算法及其C语言实现过程。系统主要实现了图的创建、单源点最短路径的计算功能。依照本系统可以解决实际生活中许多路径选择问题,...

    java单源最短路径(贪心算法)

    java单源最短路径(贪心算法) public class TheShortestWay { static int MAX_SIZE = 6; public static void dijkstra(int v, float[][] a, float[] dist, int[] prev) { int n = dist.length - 1; if (v ||...

    java解决单源最短路径

    由Dijkstra贪心算法实现,设置顶点集合实现贪心扩充直到找到源点到所有顶点的路径长度;用dist数组记录当前从源到顶点的最短特殊路径长度

    python Dijkstra算法实现最短路径问题的方法

    假设G={V,{E}}是含有n个顶点的有向图,以该图中顶点v为源点,使用Dijkstra算法求顶点v到图中其余各顶点的最短路径的基本思想如下: 使用集合S记录已求得最短路径的终点,初始时S={v}。 选择一条长度最小的...

    最短路径经典数据结构算法-dijkstra

    dijkstra算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。 本代码使用了有向图,数据为整数int,数据结构...

    yuandaima.rar_dijkstra算法

    一般背包问题的贪心算法 Dijkstra算法求解单源最短路径问题 N皇后问题 Prim算法 Kruskal算法代码

    python实现最短路径的实例方法

    广度优先搜索解决赋权有向图或者无向图的单源最短路径问题.是一种贪心的策略 算法的思路 声明一个数组dis来保存源点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点的集合:T,初始时,原点s的路径权重被赋...

    贪心算法简介及其实际应用的示例.docx

    成功应用贪心算法的问题包括霍夫曼编码、最小生成树(如Kruskal算法和Prim算法)和单源最短路径(如Dijkstra算法)等。选择贪心算法时,重要的是验证贪心选择性质和最优子结构性质,确保每步做出的局部最优选择可以...

    什么是dijkstra算法

    Dijkstra算法是一种用于解决单源最短路径问题的经典算法,由荷兰计算机科学家艾德斯·戴克斯特拉(Edsger W. Dijkstra)在1956年提出。该算法通常用于在带有非负权重的有向图中找到从一个源节点到所有其他节点的最短...

    danyuanzuiduanlujing.rar_distance

    Dijkstra算法是解单源最短路径问题的贪心算法。其基本思想是,设置顶点集合点集合S并不断地做贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设u是G的其...

    ShortestPath

    典型的解决单源最短路径的贪心算法Dijkstra算法 可以运行

    算法分析与设计 课程作业 完整版.docx

    3.单源最短路径-Dijkstra算法 4.最小代价生成树问题-Prim算法 5.最小代价生成树问题-Kruskal算法 第五章——动态规划算法 1.最优二叉搜索树 2.每对节点最短距离 3.最长公共子序列 第六章——回溯算法 1.0/1背包问题 ...

    python实现Dijkstra静态寻路算法

    迪科斯彻算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。 当然目前也有人将它用来处理物流方面,以获取...

    java8stream源码-CrackingTheCodingInterview:破解编码面试问题解决方案(InJava)

    单源最短路径(Dijkstra) 全源最短路径(Floyd Warshall) Prim 的 MST 克鲁斯卡尔的 MST 拓扑排序(例如用于确定多模块项目中的项目构建顺序) 约翰逊算法 图中的连接点 图中的桥梁 检测图中的循环 11.a Using BFS...

    基于dijkstra算法及仓储多AGV背景下实现路径规划和两车避让系统源码+项目说明.zip

    经典Dijkstra算法是一种贪心算法,根据路径长度递增次序找到最短路径,通常用于解决单源最短路的问题。Dijkstra算法的基本思想是:首先根据原有路径图,初始化源点到与其相邻节点的距离,选出与源点最短距离的节点...

    C C++算法实例.c

    标号法求解单源点最短路径: B.Floyed算法求解所有顶点对之间的最短路径: C. Dijkstra 算法: 3.计算图的传递闭包 4.无向图的连通分量 A.深度优先 B 宽度优先(种子染色法) 5.关键路径 6.拓扑排序 7.回路...

    算法导论中文版

     24.2 有向无环图中的单源最短路径问题  24.3 Dijkstra算法  24.4 差分约束和最短路径  24.5 最短路径性质的证明  思考题  本章注记 第25章 所有结点对的最短路径问题  25.1 最短路径和矩阵乘法  25.2...

    Leetcode扑克-MyDataStruct:数据结构学习记录

    图相关算法,拓扑排序、深度优先遍历、广度优先遍历、简单路径、单源最短路径(Dijkstra算法)、最小生成树(prim算法、克鲁斯卡尔算法),关键路径 matrix.impl 矩阵和三元组结构的矩阵的转置、压缩、乘法 sort 排序...

Global site tag (gtag.js) - Google Analytics