文章目录
简介
求最短路径的目的不必多说。通过设置权值,可以获取图中使用时间最短路径、途经路程最短路径等。
求最短路径的两种算法:
- 迪杰斯特拉算法 DIjkstra
- 弗洛伊德算法 Floyd
二者的主要区别在于:
Dijkstra仅求解一个顶点到其余顶点的最短路径;Floyd求解所有顶点到其余顶点的最短路径。
Dijistra的复杂度为O(n2),Floyd的复杂度为O(n3),但Floyd算法简洁优美,非常好看。
提示:下附代码,亲测可用
1. Dijkstra算法
思想类似与最小生成树中的Prim算法。先贪心求最小值,再获取迭代权值数组,如此迭代。
代码如下:
#include "iostream"
using namespace std;
#define MAX 1000
#define N 10
typedef struct {
int vnum;
int anum;
int vertex[N];
int edge[N][N];
}MGraph;
void CreateGraph(MGraph& G, int vnum, int v[9], int a[9][9])
{
G.vnum = vnum;
G.anum = vnum * vnum;
for (int i = 0; i < vnum; i++)
{
G.vertex[i] = v[i];
}
for (int i = 0; i < vnum; i++)
{
for (int j = 0; j < vnum; j++)
{
G.edge[i][j] = a[i][j];
}
}
return;
}
typedef int Patharc[9];
typedef int ShortPathTable[9];
void ShortestPath_Dijkstra(MGraph& G, int v0, Patharc* P, ShortPathTable* D)
{
int v, w, k, min;
int final[9];
for (v = 0; v < G.vnum; v++)
{
final[v] = 0;
(*D)[v] = G.edge[v0][v];
(*P)[v] = 0;
}
(*D)[v0] = 0;
final[v0] = 1;
for (v = 1; v < G.vnum; v++)
{
min = 65535;
for (w = 0; w < G.vnum; w++)
{
if (!final[w] and (*D)[w] < min)
{
k = w;
min = (*D)[w];
}
}
final[k] = 1;
cout << "D: ";
for (int i = 0; i < G.vnum; i++)
{
cout << (*D)[i] << " ";
}
cout << endl;
cout << "min: " << min << endl;
for (w = 0; w < G.vnum; w++)
{
if (!final[w] and (min + G.edge[k][w] < (*D)[w]))
{
(*D)[w] = min + G.edge[k][w];
(*P)[w] = k;
}
}
cout << "P: ";
for (int i = 0; i < G.vnum; i++)
{
cout << (*P)[i] << " ";
}
cout << endl;
}
}
int main()
{
MGraph G;
int vnum = 9;
int v[9] = {
0, 1, 2, 3, 4, 5, 6, 7, 8};
int a[9][9] = {
0, 1, 5, 65535, 65535, 65535, 65535, 65535, 65535,
1, 0, 3, 7, 5, 65535, 65535, 65535, 65535,
5, 3, 0, 65535, 1, 7, 65535, 65535, 65535,
65535, 7, 65535, 0, 2, 65535, 3, 65535, 65535,
65535, 5, 1, 2, 0, 3, 6, 9, 65535,
65535, 65535, 7, 65535, 3,