迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。
#include <iostream>
#include <string>
#include <sstream>
#include <cstring>
using namespace std;
#define N 5
#define INF 0x3f3f3f
int dis[N];
bool visit[N];
int pre[N];
// void Dijkstra(int s) //建表过程 ,建立图中所有点与s的最短路径
int Dijkstra(int s,int e,int map[N][N])//s->e的最短路径
{
memset(visit, false, sizeof(visit));
memset(dis, INF, sizeof(dis));
memset(pre, -1, sizeof(pre));
dis[s] = 0;
for (int i = 0; i < N; i++)
{
dis[i] = map[s][i];
pre[i] = s;
}
//
//建表操作
for (int i = 0; i < N; i++)
{
int distemp = INF;
int indextemp;
//找一个最近点 遍历所有点
for (int j = 0; j < N; j++)
{
if ( !visit[j] && dis[j] < distemp)
{
distemp = dis[j];
indextemp = j;
}
}
visit[indextemp] = true; //标记访问过
// 第二次遍历 目的是优化
for (int j = 0; j < N; j++)
{
if (!visit[j] && dis[j] > map[indextemp][j] + distemp)
//言外一直 a->d的直接距离 大于 a->index->d
{
dis[j] = map[indextemp][j] + distemp;
pre[j] = indextemp;//前驱点更新
}
}
}
//所有遍历完,表就建好了,有用的主要是前驱表pre[]和距离表dis[]
return dis[e];
}
void prin(int i,int s)
{
cout << pre[i] << "<-";
if(pre[i]!=s)
prin(pre[i],s);
}
int main()
{
int map[5][5] =
{
{0, 6, INF, 1, INF}, //不直接相连的点距离就是无穷大
{6, 0, 5, 2, 2},
{INF, 5, 0, 5, INF},
{1, 2, INF, 0, 1},
{INF, 2, 5, 1, 0},
};
int res = Dijkstra(0,2,map);
cout << res << endl;
cout << "2";
prin(2,0);
return 0;
}