a*算法求最短路径和floyd还有dijsktra算法求最短路径的区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了a*算法求最短路径和floyd还有dijsktra算法求最短路径的区别?相关的知识,希望对你有一定的参考价值。
参考技术A A*算法是启发式搜索,适合点对点的最短路径,单源单汇的情况Floyd是动态规划的一种,可以求出任意两点之间的最短路径
Dijkstra是贪婪算法的一种,求一点到其他所有点的最短路,即所谓的单源最短路算法
从时间复杂度来说
Floyd是O(N^3)
Dijkstra是O(N^2)
而启发式搜索就不好说了……
结果当然是一样的,都是最短路,但是适用情形和时空开销就不同了
举例来说,你做任意两点间最短路可以用N次Dijkstra或者1次Floyd,时间消耗一样,显然用后者,而如果你只用求两点间的,用Floyd就不合算了
用Dijkstra算法求最短路径
问题描述:交通网络中常常会提出这样的问题:两地之间是否有路相通?在有多条通路的情况下,哪一条最短?以上问题就是带权图中求最短路径的问题。
基本要求:
一 用DIJKSTRA算法求最短路径,图中的顶点数N 不得少于10个,待输入的数据(边的关联顶点信息和权值)存储在预先立的文件中。
二 用户输入源点和目标点后,程序应输出源点到目标点的最短路径,并计算出途中所需时间或花费的交通费用。
最好以河北省具体的地图为准,参数最好要真实!
在线等!~ Q471347130 phone15081474660沧州
#include <string.h>
#define MAX 20
int mincost(int V[], int D[], int n);
int main()
int C[MAX][MAX];
int D[MAX], V[MAX] = 0 ; /*数组V用来表示每次计算加入集合V的点,1为加入了,0为还没有加入*/
int n, i, j, k, w, sum;
printf("请输入顶点个数:");
scanf("%d", &n);
printf("\n请输入建立后的临接矩阵(用n*n矩阵表示), 输入100000表示无穷大:\n");
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
scanf("%d", &C[i][j]);
V[1] = 1; /*1为源点*/
for(i = 1; i <= n; i++)
D[i] = C[1][i]; /*D置初值*/
for(i = 1; i <= n; i++)
/*从集合S(即没有经过计算的点)中选出一个点w(即V中值为0),使D[w]值最小*/
w = mincost(V, D, n);
V[w] = 1;
/*由于w的选定,S中的每个点(即V中值为0的点都要重新计算其到源点的最小值*/
for(k = 2; k <= n; k++)
if(V[k] == 0)
sum = D[w] + C[w][k];
if(sum < D[k])
D[k] = sum;
for(i = 2; i <= n; i++)
printf("D[%d] = %d\n", i, D[i]);
memset(V, 0, MAX * sizeof(int)); /*初始化*/
return 0;
int mincost(int V[], int D[], int n)
int temp = 10000000, i, w = 2;
for(i = 2;i <= n; i++)
if(V[i] == 0 && D[i] < temp)
temp = D[i];
w = i;
return w;
改成文件的就行了本回答被提问者和网友采纳
以上是关于a*算法求最短路径和floyd还有dijsktra算法求最短路径的区别?的主要内容,如果未能解决你的问题,请参考以下文章
求最短路径的三种算法: Ford, Dijkstra和Floyd