Dijkstra算法

Dijkstra 算法的基本思想

从图的起点( s )开始, 首先标记起点( s )到本身的距离为 0( dist[s] = 0 ), 而后将起点到其余点的距离( dist[i] )赋初值, 若不连通则( dist[i] = MAX), MAX = 999. 算法

用迭代的方式, 从未访问点中找出最近的点( u ), 访问该点( visited[u] = true ), 并从点( u )出发, 更新起点到全部未访问点的最短路径.spa

迭代至图中全部点都被访问 visited[i] = true, 此时即已经求出了起点( s )到其余点的最短路径code

 

Dijkstra 算法代码实现

// 顶点到其余点的距离
int dist[] = new int[4];
// 该路径的直接前继
int prev[] = new int[4];;
// 该点是否被访问
boolean visited[] = new boolean[4];;
// 两点之间不连通的权重值
int MAX = 999;
public void dijkstra(int s, int g[][]) {
	// 初始化
	for (int i = 0; i < g.length; i++) {
		dist[i] = g[s][i];    // 为每条路径赋初值
		visited[i] = false;    // 初始时, 每一个点都未访问
		if (dist[i] == MAX) {    // 顶点到i不连通, prev[i] = -1
			prev[i] = -1;
		} else {    // 起点到i点联通, 设置该点的直接前继为起点 s, prev[i] = s
			prev[i] = s;
		}
	}
	dist[s] = 0;    // 设置起点到本身的距离为0
	visited[s] = true;    // 顶点已被访问
	for (int i = 1; i < g.length; i++) {
		int min = MAX;
		int u = s;
		for (int j = 1; j < g.length; j++) {    // 从未访问点中找出最近的点( u )
			if (!visited[j] && dist[j] < min) {
				min = dist[j];
				u = j;
			}
		}
		visited[u] = true;
		// 从点( j )出发, 更新起点到全部未访问点的最短路径
		for (int j = 1; j < g.length; j++) {
			if (!visited[j] && dist[j] > g[s][u] + g[u][j]) {
				dist[j] = g[s][u] + g[u][j];
				prev[j] = u;
			}
		}
	}
}

 

Dijkstra 算法是目前最快的单源最短路径算法, 其算法时间复杂度为 O(n^2)it

相关文章
相关标签/搜索