從圖的起點( s )開始, 首先標記起點( s )到本身的距離爲 0( dist[s] = 0 ), 而後將起點到其餘點的距離( dist[i] )賦初值, 若不連通則( dist[i] = MAX), MAX = 999. 算法
用迭代的方式, 從未訪問點中找出最近的點( u ), 訪問該點( visited[u] = true ), 並從點( u )出發, 更新起點到全部未訪問點的最短路徑.spa
迭代至圖中全部點都被訪問 visited[i] = true, 此時即已經求出了起點( s )到其餘點的最短路徑code
// 頂點到其餘點的距離 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