在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题。
在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用的一种,是一种按照路径长度递增的次序产生最短路径的算法。
可将迪杰斯特拉算法描述如下:
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 50;
const int INF = 1000000000;
int mat[MAXN][MAXN], dis[MAXN], v[MAXN];
int n, s;
void dijkstra() {
int i, j, k;
for (i = 0; i < n; i++) {
dis[i] = INF;
v[i] = 0;
}
dis[s] = 0;
for (j = 0; j < n; j++)
{
k = -1;
//扩展
for (i = 0; i < n; i++)
{
if (!v[i] && (k == -1 || dis[i] < dis[k]))
k = i;
}
v[k] = 1;
//更新
for (i = 0; i < n; i++) {
if (!v[i] && dis[k] + mat[k][i] < dis[i]) {
dis[i] = dis[k] + mat[k][i];
}
}
}
}
int main()
{
scanf("%d%d", &n, &s);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
scanf("%d", &mat[i][j]);
if (mat[i][j] == 0)
mat[i][j] = INF;
}
dijkstra();
for (int i = 0; i < n; i++) {
if (i != s) {
if (dis[i] < INF)
printf("%d ", dis[i]);
else
printf("-1 ");
}
}
puts("");
return 0;
}