Implementierung von kürzesten Pfaden in Java
Implementierung des Dijkstra-Algorithmus
Hier ist ein Beispiel, wie man den Dijkstra-Algorithmus in Java implementiert, um den kürzesten Pfad zwischen zwei Knoten in einem gewichteten Graphen zu finden:
import java.util.*;
public class DijkstraShortestPath {
public static Map<Integer, Integer> dijkstra(Map<Integer, List<int[]>> graph, int source, int destination) {
Map<Integer, Integer> distances = new HashMap<>();
PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> a[1] - b[1]);
// Initialize distances and add the source node to the priority queue
for (int node : graph.keySet()) {
distances.put(node, Integer.MAX_VALUE);
}
distances.put(source, 0);
pq.offer(new int[]{source, 0});
while (!pq.isEmpty()) {
int[] current = pq.poll();
int currentNode = current[0];
int currentDistance = current[1];
// If we've reached the destination, return the distances map
if (currentNode == destination) {
return distances;
}
// If the current distance is greater than the recorded distance, skip this node
if (currentDistance > distances.get(currentNode)) {
continue;
}
// Update the distances and add the neighbors to the priority queue
for (int[] neighbor : graph.get(currentNode)) {
int neighborNode = neighbor[0];
int neighborWeight = neighbor[1];
int totalDistance = currentDistance + neighborWeight;
if (totalDistance < distances.get(neighborNode)) {
distances.put(neighborNode, totalDistance);
pq.offer(new int[]{neighborNode, totalDistance});
}
}
}
return distances;
}
public static void main(String[] args) {
// Example usage
Map<Integer, List<int[]>> graph = new HashMap<>();
graph.put(1, new ArrayList<>(Arrays.asList(new int[]{2, 4}, new int[]{3, 2}, new int[]{4, 7})));
graph.put(2, new ArrayList<>(Arrays.asList(new int[]{1, 4}, new int[]{3, 3}, new int[]{4, 4}, new int[]{5, 5})));
graph.put(3, new ArrayList<>(Arrays.asList(new int[]{1, 2}, new int[]{2, 3}, new int[]{4, 3}, new int[]{5, 1})));
graph.put(4, new ArrayList<>(Arrays.asList(new int[]{1, 7}, new int[]{2, 4}, new int[]{3, 3}, new int[]{5, 2})));
graph.put(5, new ArrayList<>(Arrays.asList(new int[]{2, 5}, new int[]{3, 1}, new int[]{4, 2})));
Map<Integer, Integer> distances = dijkstra(graph, 1, 5);
System.out.println("Shortest distance from 1 to 5: " + distances.get(5));
}
}
Diese Implementierung verwendet eine Priority Queue, um den Graphen effizient zu durchsuchen und die kürzesten Entfernungen zu aktualisieren. Die Methode dijkstra()
nimmt einen als Adjazenzlisten-Map dargestellten Graphen, einen Startknoten und einen Zielknoten entgegen und gibt eine Map der kürzesten Entfernungen vom Startknoten zu allen anderen Knoten zurück.
Implementierung der Breitensuche (Breadth-First Search, BFS)
Hier ist ein Beispiel, wie man die BFS in Java implementiert, um den kürzesten Pfad zwischen zwei Knoten in einem ungewichteten Graphen zu finden:
import java.util.*;
public class BreadthFirstSearch {
public static Map<Integer, Integer> bfs(Map<Integer, List<Integer>> graph, int source, int destination) {
Map<Integer, Integer> distances = new HashMap<>();
Queue<Integer> queue = new LinkedList<>();
// Initialize distances and add the source node to the queue
for (int node : graph.keySet()) {
distances.put(node, Integer.MAX_VALUE);
}
distances.put(source, 0);
queue.offer(source);
while (!queue.isEmpty()) {
int currentNode = queue.poll();
// If we've reached the destination, return the distances map
if (currentNode == destination) {
return distances;
}
// Explore the neighbors and update their distances
for (int neighbor : graph.get(currentNode)) {
if (distances.get(neighbor) == Integer.MAX_VALUE) {
distances.put(neighbor, distances.get(currentNode) + 1);
queue.offer(neighbor);
}
}
}
return distances;
}
public static void main(String[] args) {
// Example usage
Map<Integer, List<Integer>> graph = new HashMap<>();
graph.put(1, new ArrayList<>(Arrays.asList(2, 3, 4)));
graph.put(2, new ArrayList<>(Arrays.asList(1, 3, 5)));
graph.put(3, new ArrayList<>(Arrays.asList(1, 2, 4, 5)));
graph.put(4, new ArrayList<>(Arrays.asList(1, 3, 5)));
graph.put(5, new ArrayList<>(Arrays.asList(2, 3, 4)));
Map<Integer, Integer> distances = bfs(graph, 1, 5);
System.out.println("Shortest distance from 1 to 5: " + distances.get(5));
}
}
Diese Implementierung verwendet eine Queue, um den Graphen in Breitensuche zu durchsuchen. Die Methode bfs()
nimmt einen als Adjazenzlisten-Map dargestellten Graphen, einen Startknoten und einen Zielknoten entgegen und gibt eine Map der kürzesten Entfernungen vom Startknoten zu allen anderen Knoten zurück.
Fazit
In diesem Tutorial haben Sie gelernt, wie man zwei beliebte Algorithmen für kürzeste Pfade, den Dijkstra-Algorithmus und die Breitensuche, in Java implementiert. Diese Algorithmen werden in verschiedenen Anwendungen weit verbreitet eingesetzt und können Ihnen helfen, die effizientesten Pfade in Ihren graphenbasierten Problemen zu finden.
Denken Sie daran, den geeigneten Algorithmus basierend auf den spezifischen Anforderungen Ihres Problems auszuwählen, wie z. B. ob der Graph gewichtet oder ungewichtet ist und ob Sie den kürzesten Pfad zwischen einem einzelnen Startknoten und allen anderen Knoten oder zwischen einem einzelnen Startknoten und einem einzelnen Zielknoten finden müssen.