最短路徑java
在Java中,最短路徑問題可以通過多種算法來解決,例如Dijkstra算法、A*算法、Bellman-Ford算法等。這裡我將提供一個簡單的Dijkstra算法的Java實現,用於找到圖中兩點之間的最短路徑。
首先,我們需要一個圖的數據結構來存儲圖的信息。這裡我們使用一個簡單的二維數組來表示圖,其中每個元素的值表示兩個頂點之間的權重。以下是一個簡單的圖的例子:
int[][] graph = {
{0, 4, 8, 11},
{4, 0, 7, 2},
{8, 7, 0, 9},
{11, 2, 9, 0}
};
這個圖表示四個頂點(0, 1, 2, 3)之間的權重。例如,從頂點0到頂點1的權重是4,從頂點0到頂點2的權重是8,等等。
現在,我們可以實現Dijkstra算法來找到從某個起始頂點到其他所有頂點的最短路徑。以下是一個簡單的Dijkstra算法的實現:
import java.util.*;
public class Dijkstra {
public static void main(String[] args) {
int[][] graph = {
{0, 4, 8, 11},
{4, 0, 7, 2},
{8, 7, 0, 9},
{11, 2, 9, 0}
};
int source = 0; // 起始頂點
int[] distances = dijkstra(graph, source);
System.out.println("Distance from source to each vertex:");
for (int i = 0; i < distances.length; i++) {
System.out.println("Vertex " + i + ": " + distances[i]);
}
}
public static int[] dijkstra(int[][] graph, int source) {
int vertices = graph.length;
// 距離數組,存儲從起始頂點到每個頂點的最短路徑的距離
int[] distances = new int[vertices];
// 標記數組,表示頂點是否已被訪問過
boolean[] visited = new boolean[vertices];
// 初始化距離數組
for (int i = 0; i < vertices; i++) {
distances[i] = Integer.MAX_VALUE;
}
// 起始頂點的距離為0
distances[source] = 0;
// 優先佇列,用於存儲未訪問的頂點及其距離
PriorityQueue<Integer> queue = new PriorityQueue<>(Comparator.comparingInt(distances::length));
queue.offer(source);
while (!queue.isEmpty()) {
// 取出距離最短的頂點
int vertex = queue.poll();
// 已經訪問過該頂點,跳過
if (visited[vertex]) {
continue;
}
// 訪問該頂點
visited[vertex] = true;
// 遍歷該頂點的鄰居頂點
for (int i = 0; i < vertices; i++) {
// 如果存在權重為0的邊,則表示是障礙物,不考慮
if (graph[vertex][i] == 0) {
continue;
}
// 更新鄰居頂點的距離
int newDist = distances[vertex] + graph[vertex][i];
if (newDist < distances[i]) {
distances[i] = newDist;
queue.offer(i);
}
}
}
return distances;
}
}
在這個實現中,我們使用了一個優先佇列來存儲未訪問的頂點及其距離。每次我們從佇列中取出距離最短的頂點,並檢查其鄰居頂點,如果存在更短的路徑,則更新距離。
請注意,這個實現假設圖是無向的(即權重是對稱的),並且沒有負權重邊。如果圖是有向的或有負權重邊,你需要對算法進行相應的修改。
此外,這個實現只找到了從起始頂點到每個其他頂點的最短路徑,而不是兩點之間的最短路徑。如果你需要找到兩點之間的最短路徑,你需要在找到所有頂點的距離後,使用BFS或DFS來找到實際的路徑。