Dijkstra用于解决一个节点到其他任意节点的最短路径值。其值用一个dis数组保存。
首先给出一个有向图使用邻接矩阵储存。
dis数组初始化为1节点到其他节点的距离。
0 | 1 | 12 | inf | inf | inf |
初始化无法直达的节点都表示为无穷大(inf)。
接下来在这个数组中寻找最近的节点-->2。
然后通过2节点为起点去优化dis数组。很明显2号节点到3号节点权值为9,1->2->3小于1->3的权值,于是将dis[3]=10。
0 | 1 | 10 | 4 | inf | inf |
3号节点和4号节点在第一轮优化中得到更新。
第二轮优化时,再找出最短路径的点,但是应该注意到已经作过起点的点不能再被选中。于是排除1,2节点最短的是4号。
0 | 1 | 8 | 4 | 17 | 19 |
第三轮优化,排除1,2,4。得到最短的是3。
0 | 1 | 8 | 4 | 13 | 19 |
第四轮优化,排除1,2,3,4得到最短的是5。
0 | 1 | 8 | 4 | 13 | 17 |
注意有两个数组需要初始化
首先需要初始化map邻接矩阵对角线为0其余全为inf。
读完边之后初始化dis数组将其值都设为1号节点到其他节点的初始值。
#include <iostream>
#include <cstdio>
#include <cstring>
#define inf 0x3f3f3f3f
using namespace std;
int m,n,map[101][101],dis[101],book[101];
void Dijkstra(){
int i,j;
book[1] = 1;
for (i = 1;i < m; i++){
int min = inf,total;
for (j = 1;j <= m; j++){
if (min > dis[j] && !book[j]){
min = dis[j];
total = j;
}
}
book[total] = 1;
for (j = 1;j <= m ;j++){
if (dis[j] > map[total][j] + dis[total]){
dis[j] = map[total][j] + dis[total];
}
}
}
for (i = 1;i <= m; i++)
printf ("%d%c",dis[i],i==m?'\n':' ');
}
int main ()
{
scanf ("%d%d",&m,&n);
int i,j;
for (i = 1;i <= m; i++){//初始化邻接矩阵
for (j = 1;j <= m; j++){
if (i == j)
map[i][j] = 0;
else
map[i][j] = inf;
}
}
for (i = 1;i <= n; i++){
int a,b,c;
scanf ("%d%d%d",&a,&b,&c);
map[a][b] = c;
}
for (i = 1;i <= m; i++){
dis[i] = map[1][i];//初始化dis数组将其值都设为1号节点到其他节点的初始值
}
Dijkstra ();
return 0;
}