- 算法简介:迪杰斯特拉算法是求解单源最短路径的一种算法。将节点分为已选择和未被选择,每次从未被选择的节点中选取与源节点具有最短距离的节点,将其加入到已被选择的节点中,同时,更新所有节点到源节点的最短距离。
- 设计思路:其主要思想是贪心算法,每一次在未被选择的节点中选择与源节点具有最短距离的节点。选择此节点node之后,利用此节点node更新源节点到其他节点的距离,即比较此源节点到节点i的距离和(源节点到node的距离+node到i的距离)。可利用邻接矩阵存储图的数据。需要一个dis[]数组存储源节点到其他节点之间的最短距离,state[]数组存储节点是否被选择。每次用贪心算法在未被选择的节点中选取与源节点具有最短距离的节点。
3.代码:
/*Dijstra算法*/
#include <iostream>
using namespace std;
#define number 4 //定义节点数量
#define INT 0x3f3f3f3f //定义无穷大
/*节点距离:*/
int edge[number][number] = {
{0,3,7,4},
{3,0,2,INT},
{7,2,0,2},
{4,INT,2,0}
};
int main()
{
/*Dijstra算法:贪心算法+松弛法*/
int dis[number]; //定义第一个节点到其他节点的最短距离
bool state[number] = {false}; //定义每个节点是否已被选择
memset(dis, INT, sizeof(dis));
dis[0] = 0;
for (int i = 0; i < number; i++)
{
int node = -1; //当前与源节点具有最短距离的节点
for (int j = 0; j < number; j++)
{
if (!state[j] && (node == -1 || dis[j] < dis[node]))
{
node = j;
}
}
//利用node节点更新源节点到其他节点之间的距离
for (int k = 0; k < number; k++)
{
if ((dis[node] + edge[node][k]) < dis[k])
{
dis[k] = dis[node] + edge[node][k];
}
}
state[node] = true;
}
cout << "节点0到其他节点的最短距离为:" << endl;
for (int i = 0; i < number; i++)
{
cout << dis[i] <<" ";
}
return 0;
}
4.运行结果:
5.总结:迪杰斯特拉算法是一种求解单源最短路径的算法,即源节点到其他每个节点的最短路径。将节点分为已被选择和为被选择的两类节点,每次都在为被选择的节点中选择与源节点具有最短距离的节点(贪心算法),将其加入到已被选择节点中,同时,利用此节点更新源节点到其他的节点之间的最短距离。