求单源的最短路径算法
- Dijkstra算法是用来求单源最短路径问题,即给定图G和起点s,通过算法得到s到达其他每个顶点的最短距离。
- 给定图G和起点S
- 通过算法得到s到达其他每个顶点的最短距离。
基本思想
- 对图G(V,E)设置集合S存放已经被访问的顶点.
- 然后每次从V-S中选择与起点S距离最小的一个顶点,记作U,访问并加入集合S中.
- 之后,令u为中介点,优化从起点s到所有u能到达的顶点v之间的最短距离.
- 这样执行n次.(n个顶点数量)直到集合S已经包含了所有顶点
Dijkstra算法
时间复杂度: O(V*V+E)
void Dijkstra(int n, int s, vector<vector<int>> G, vector<bool> &visited,
vector<int> &d) {
// 先初始化所有的距离 d[i]表示s到i的最小距离
fill(d.begin(), d.end(), INT_MAX);
for (int i = 0; i < n; i++) {
// 选出最小距离的点
int u = -1;
int MIN = INT_MAX;
for (int j = 0; j < n; j++) {
if (visited[j] == false && d[j] < MIN) {
MIN = d[j];
u = j;
}
}
if (u == -1) {
// 说明没有找到,说明剩下顶点与起点s不连通
return ;
}
// 将这个一点加入S集合
visited[u] = true;
for (int v = 0; v < n; v++) {
// 未访问过且
if (visited[v] == false && d[u] + G[u][v] < d[v]) {
d[v] = d[u] + G[u][v];
}
}
}
}