Dijkstra_C++
#pragma once
#include<vector>
#include<string>
namespace algorithm {
class MyAlgorithm {
public:
// Dijkstra method implemented in C++
static std::vector<std::vector<int>> Dijkstra(int n, const std::vector<std::vector<int>>& edges, std::vector<std::vector<std::string>>& path);
};
}
#include"MyAlgorithm.h"
namespace algorithm {
// 传参分别为结点数量n, 边的邻接矩阵edges, 保存最短路径结果的path
// 返回最短距离矩阵distance
std::vector<std::vector<int>> MyAlgorithm::Dijkstra(int n, const std::vector<std::vector<int>>& edges, std::vector<std::vector<std::string>>& path)
{
std::vector<std::vector<int>> distance(n, std::vector<int>(n, INT_MAX));
// 初始化
for (int i = 0; i < n; ++i) {
distance[i][i] = 0;
path[i][i] = std::to_string(i);
}
// start 为起点
for (int start = 0; start < n; ++start) {
// points 保存已找到的每个最短路径的尾结点
std::vector<int> points{ start };
// visited 记录每个点是否已经是最短路径点
std::vector<bool> visited(n, false);
visited[start] = true;
// 一共要判断n-1 次, 每次产生一个新的最短路径
for (int k = 1; k < n; ++k) {
int minValue = INT_MAX;
int minPoint = start;
for (int i = 0; i < n; ++i) {
if (visited[i]) {
continue;
}
for (int num : points) {
// 判断从当前的最短路径出发,是否有更短路径存在, 若有则更新
if (edges[num][i] > 0 && distance[start][num] + edges[num][i] < distance[start][i]) {
distance[start][i] = distance[start][num] + edges[num][i];
distance[i][start] = distance[start][i];
path[start][i] = path[start][num] + "->" + std::to_string(i);
}
}
if (distance[start][i] < minValue) {
minValue = distance[start][i];
minPoint = i;
}
}
// 每次循环后添加新的最短路径点
points.push_back(minPoint);
visited[minPoint] = true;
}
// 对于无向图,最短路径是双向的
for (int i = 0; i < n; ++i) {
path[i][start] = path[start][i];
}
}
return distance;
}
}
后续改进:
很明显能看出,由于无向图的双向性,i->j的最短路径和j->i的最短路径是相同的,因此,在计算时可以通过令i=start+1,从而省去一半的计算量