davegimo

graphnode main v2

Aug 23rd, 2023 (edited)
955
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.77 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. class GraphNode {
  4.     private int id;
  5.     private Map<GraphNode, Integer> neighbors;
  6.  
  7.     public GraphNode(int id) {
  8.         this.id = id;
  9.         this.neighbors = new HashMap<>();
  10.     }
  11.  
  12.     public int getId() {
  13.         return id;
  14.     }
  15.  
  16.     public Map<GraphNode, Integer> getNeighbors() {
  17.         return neighbors;
  18.     }
  19.  
  20.     public void addNeighbor(GraphNode neighbor, int weight) {
  21.         neighbors.put(neighbor, weight);
  22.     }
  23.  
  24.     // ...
  25.  
  26.     // Bellman-Ford algorithm
  27.     public Map<GraphNode, Integer> bellmanFordShortestPaths(GraphNode source) {
  28.         Map<GraphNode, Integer> distanceMap = new HashMap<>();
  29.         Map<GraphNode, List<GraphNode>> shortestPaths = new HashMap<>();
  30.        
  31.         for (GraphNode node : getAllNodes()) {
  32.             distanceMap.put(node, Integer.MAX_VALUE);
  33.             shortestPaths.put(node, new ArrayList<>());
  34.         }
  35.        
  36.         distanceMap.put(source, 0);
  37.         shortestPaths.get(source).add(source);
  38.  
  39.         for (int i = 0; i < getAllNodes().size() - 1; i++) {
  40.             for (GraphNode node : getAllNodes()) {
  41.                 for (Map.Entry<GraphNode, Integer> neighborEntry : node.getNeighbors().entrySet()) {
  42.                     int newDistance = distanceMap.get(node) + neighborEntry.getValue();
  43.                     if (newDistance < distanceMap.get(neighborEntry.getKey())) {
  44.                         distanceMap.put(neighborEntry.getKey(), newDistance);
  45.                         shortestPaths.get(neighborEntry.getKey()).clear();
  46.                         shortestPaths.get(neighborEntry.getKey()).addAll(shortestPaths.get(node));
  47.                         shortestPaths.get(neighborEntry.getKey()).add(neighborEntry.getKey());
  48.                     }
  49.                 }
  50.             }
  51.         }
  52.  
  53.         printShortestPaths(distanceMap, shortestPaths);
  54.  
  55.         return distanceMap;
  56.     }
  57.  
  58.     private void printShortestPaths(Map<GraphNode, Integer> distanceMap, Map<GraphNode, List<GraphNode>> shortestPaths) {
  59.         System.out.println("s d dist path");
  60.         System.out.println("---- ---- ------------ -------------------");
  61.  
  62.         List<GraphNode> sortedNodes = new ArrayList<>(getAllNodes());
  63.         sortedNodes.sort(Comparator.comparingInt(GraphNode::getId));
  64.  
  65.         for (GraphNode node : sortedNodes) {
  66.             System.out.printf("%d %d %.4f %s%n", getId(), node.getId(), distanceMap.get(node) / 1.0,
  67.                     buildPathString(shortestPaths.get(node)));
  68.         }
  69.     }
  70.    
  71.     private String buildPathString(List<GraphNode> path) {
  72.         StringBuilder sb = new StringBuilder();
  73.         for (int i = 0; i < path.size(); i++) {
  74.             sb.append(path.get(i).getId());
  75.             if (i < path.size() - 1) {
  76.                 sb.append("->");
  77.             }
  78.         }
  79.         return sb.toString();
  80.     }
  81.  
  82.     // Helper method to get all nodes in the graph
  83.     private Set<GraphNode> getAllNodes() {
  84.         Set<GraphNode> allNodes = new HashSet<>();
  85.         collectNodes(this, allNodes);
  86.         return allNodes;
  87.     }
  88.  
  89.     private void collectNodes(GraphNode node, Set<GraphNode> allNodes) {
  90.         if (!allNodes.contains(node)) {
  91.             allNodes.add(node);
  92.             for (GraphNode neighbor : node.getNeighbors().keySet()) {
  93.                 collectNodes(neighbor, allNodes);
  94.             }
  95.         }
  96.     }
  97. }
  98.  
  99. public class Main {
  100.     public static void main(String[] args) {
  101.         GraphNode node0 = new GraphNode(0);
  102.         GraphNode node1 = new GraphNode(1);
  103.         GraphNode node2 = new GraphNode(2);
  104.         GraphNode node3 = new GraphNode(3);
  105.         GraphNode node4 = new GraphNode(4);
  106.         GraphNode node5 = new GraphNode(5);
  107.         GraphNode node6 = new GraphNode(6);
  108.         GraphNode node7 = new GraphNode(7);
  109.         GraphNode node8 = new GraphNode(8);
  110.         GraphNode node9 = new GraphNode(9);
  111.         GraphNode node10 = new GraphNode(10);
  112.         GraphNode node11 = new GraphNode(11);
  113.  
  114.         node0.addNeighbor(node1, 1);
  115.  
  116.         node1.addNeighbor(node11, 1);
  117.         node1.addNeighbor(node5, 4);
  118.         node1.addNeighbor(node4, 1);
  119.  
  120.         node2.addNeighbor(node8, 1);
  121.         node2.addNeighbor(node5, 1);
  122.  
  123.         node5.addNeighbor(node6, 1);
  124.  
  125.         node11.addNeighbor(node8, 1);
  126.  
  127.         node6.addNeighbor(node3, 1);
  128.         node6.addNeighbor(node4, 1);
  129.  
  130.         node4.addNeighbor(node7, 1);
  131.  
  132.         node7.addNeighbor(node9, 1);
  133.  
  134.         node9.addNeighbor(node10, 1);
  135.         node9.addNeighbor(node3, 1);
  136.  
  137.         node10.addNeighbor(node3, 1);
  138.        
  139.         node0.bellmanFordShortestPaths(node0);
  140.         node1.bellmanFordShortestPaths(node1);
  141.         node2.bellmanFordShortestPaths(node2);
  142.         node3.bellmanFordShortestPaths(node3);
  143.         node4.bellmanFordShortestPaths(node4);
  144.     }
  145. }
  146.  
Advertisement
Add Comment
Please, Sign In to add comment