前提:没有负边 (如果有负边, 可以用此方法检查是否有负圈)
const[MAX_V][MAX_V] 表示边的权重值
d[MAX_V] 保存从起点到每个点的总权重值
bool used[MAX_V] 表示当前点是否已经访问完毕
思想:找到一个已经确定最短距离的点, 更新跟它相邻的点, 之后这个点就不用关心了。
起点最短距离是零, 最短距离已经确定, 那可以更新与他相邻的点的距离, 其中最短的一个距离的点的距离一定是确定的(因为没有更短的路到达它)。那么这个点就找到了, 因此我们每次只需要找到当前距离起点最短的点即可(前提这个点之前没有被使用过,也就是不是之前已经确定过的点);
代码实现:
#include <iostream>
#include <cstdio>
using namespace std;
int cost[MAX_V][MAX_V];
int d[MAX_V];
bool used[MAX_V];
int V; //表示顶点的数量
void Dijkstra(int s) //s代表起点
{
fill(d, d+V, INF);
fill(used, used+V, false);
d[s] = 0;
while(true)
{
int v = -1;
for(int i= 0; i<V; ++i)
if(!used[i] && (v == -1 || d[v] > d[i])) v = i; //找到距离最小的节点
if(v == -1) break;
used[v] = true;
for(int i=0; i<V; ++i)
d[i] = min(d[i], d[v] + cost[v][i]);
}
}