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

相關文章
相關標籤/搜索