作用:
在任意给定的图中,确定特定节点到其他点的最短距离。
所需参数:
bool final[] :记录节点是否已确定为最短路径。
int dis[] :每个节点到出发点的距离。
vector<int> path[]:记录到达各个节点所经过的所有节点。
步骤:
- 设置final都为false,dis都为无穷大;
- 选定出发点,dis设为0,path设为自身;
- while循环,每次循环确定一个节点。 1. 选定一个当前到出发点路径最短并且还未确定的节点,将final设为true。(若当前选定的 最短路径为无穷大,说明剩余节点不联通,跳出循环) 2.当前节点更新其他未知的节点路径。
代码:
void dijkstra(int n,int a[MAXLEN][MAXLEN], int v0) {
bool final[n];
int dis[n];
vector<int> path[n];
for(int i = 0; i < n; i++) {
final[i] = false;
dis[i] = INT_MAX;
}
dis[v0] = 0;
path[v0].push_back(v0);
int num = n;
while(num--) {
int minDis = INT_MAX;
int v;
for(int i = 0; i < n; i++) {
if(dis[i] < minDis && !final[i]) {
v = i;
minDis = dis[i];
}
}
if(minDis == INT_MAX)
break;
final[v] = true;
for(int i = 0; i < n; i++) {
if(a[v][i] != 0 && dis[v] + a[v][i] < dis[i] && !final[i]) {
dis[i] = dis[v] + a[v][i];
path[i] = path[v];
path[i].push_back(i);
}
}
}
}