单源最短路径——Dijkstra

简述

单源最短路径是图论的一种典型应用,给定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;
			}
		}
	}
}
上一篇:单源最短路-dijkstra算法及其优化


下一篇:骑车比赛 (dijkstra单源最短路)