在图论中,最短路径和最小生成树问题是两个重要的课题。本文将介绍三种经典的算法:Dijkstra、Prim和Kruskal,并对它们进行对比分析。我们将讨论这些算法解决的问题、各自的优劣性以及它们之间的异同点,并提供完整的代码示例。
Dijkstra算法
Dijkstra算法用于解决单源最短路径问题,即从图中的一个顶点出发,找到到其他所有顶点的最短路径。
Dijkstra算法的工作原理:
- 初始化:将源点到自己的距离设为0,其他所有顶点到源点的距离设为无穷大。
- 优先队列:使用一个优先队列存储顶点,按照当前最短路径距离进行排序。
- 松弛操作:从优先队列中取出距离最小的顶点,更新与其相邻的顶点的最短路径距离。
- 重复:重复上述步骤,直到优先队列为空。
Java代码示例:
import java.util.*;
public class Dijkstra {
public static int[] dijkstra(Graph graph, int source) {
int V = graph.size();
int[] distTo = new int[V];
boolean[] visited = new boolean[V];
Arrays.fill(distTo, Integer.MAX_VALUE);
distTo[source] = 0;
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.add(new Node(source, 0));
while (!pq.isEmpty()) {
Node node = pq.poll();
int v = node.vertex;
if (visited[v]) continue;
visited[v] = true;
for (Graph.Edge edge : graph.getEdges(v)) {
int w = edge.to;
if (visited[w]) continue;
relax(edge, v, w, distTo, pq);
}
}
return distTo;
}
private static void relax(Graph.Edge edge, int v, int w, int[] distTo, PriorityQueue<Node> pq) {
if (distTo[v] + edge.weight < distTo[w]) {
distTo[w] = distTo[v] + edge.weight;
pq.add(new Node(w, distTo[w]));
}
}
static class Node implements Comparable<Node> {
int vertex;
int distance;
Node(int vertex, int distance) {
this.vertex = vertex;
this.distance = distance;
}
@Override
public int compareTo(Node other) {
return Integer.compare(this.distance, other.distance);
}
}
public static void main(String[] args) {
Graph graph = new Graph(5);
graph.addEdge(0, 1, 10);
graph.addEdge(0, 3, 30);
graph.addEdge(0, 4, 100);
graph.addEdge(1, 2, 50);
graph.addEdge(2, 4, 10);
graph.</