简述
单源最短路径是图论的一种典型应用,给定n个顶点(包括一个源点)以及一些顶点间的权值,求各个顶点到源点之间的最小的权值和,即最短路。
c++代码
用vis标记访问过的顶点,d[u]表示顶点u到源点之间的距离,w[u][v]表示连接顶点 u 和 v 的边的权值。
void Dijkstra() {
memset(vis, 0, sizeof(vis));
d[0] = 0;
for(int i = 1; i < n; i++) {
d[i] = INF;
}
int t = n;
while(t--) {
int x, m = INF;
for(int i = 0; i < n; i++) {
if(!vis[i] && d[i] < m) {
x = i; m = d[i];
}
}
vis[x] = 1;
for(int i = 0; i < n; i++) {
d[i] = min(d[i], d[x] + w[x][i]);
}
}
}
当需要输出整条路径时,只需要在最后更新d[i]的时候顺带记录父节点。代码如下:
void Dijkstra() {
memset(vis, 0, sizeof(vis));
d[0] = 0;
for(int i = 1; i < n; i++) {
d[i] = INF;
}
int t = n;
while(t--) {
int x, m = INF;
for(int i = 0; i < n; i++) {
if(!vis[i] && d[i] < m) {
x = i; m = d[i];
}
}
vis[x] = 1;
for (int i = 0; i < n; i++) {
if (d[i] > d[x] + w[x][i]) {
d[i] = d[x] + w[x][i];
fa[i] = x;
}
}
}
}