davegimo

versione1 es4

Aug 23rd, 2023
970
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.37 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import java.util.Map;
  5.  
  6. class GraphNode {
  7.     public int id;
  8.     public Map<Integer, Integer> neighbors;
  9.  
  10.     public GraphNode(int id) {
  11.         this.id = id;
  12.         this.neighbors = new HashMap<>();
  13.     }
  14.  
  15.     public int getId() {
  16.         return id;
  17.     }
  18.  
  19.     public Map<Integer, Integer> getNeighbors() {
  20.         return neighbors;
  21.     }
  22.  
  23.     public void addNeighbor(GraphNode neighbor, int weight) {
  24.         neighbors.put(neighbor.getId(), weight);
  25.         neighbor.neighbors.put(this.id, weight); // Bidirectional edge
  26.     }
  27.    
  28.     public void removeNeighbor(GraphNode neighbor) {
  29.         neighbors.remove(neighbor.getId());
  30.         neighbor.neighbors.remove(this.id);
  31.     }
  32.  
  33.     public boolean hasNeighbor(GraphNode neighbor) {
  34.         return neighbors.containsKey(neighbor.getId());
  35.     }
  36.  
  37.     public Integer getWeightToNeighbor(GraphNode neighbor) {
  38.         return neighbors.get(neighbor.getId());
  39.     }
  40.  
  41.  
  42.     public Map<GraphNode, Integer> bellmanFordShortestPaths(GraphNode source) {
  43.         Map<GraphNode, Integer> distanceMap = new HashMap<>();
  44.         Map<GraphNode, List<GraphNode>> shortestPaths = new HashMap<>();
  45.        
  46.         for (GraphNode node : getNeighbors().keySet()) {
  47.             distanceMap.put(node, Integer.MAX_VALUE);
  48.             shortestPaths.put(node, new ArrayList<>());
  49.         }
  50.        
  51.         distanceMap.put(source, 0);
  52.         shortestPaths.get(source).add(source);
  53.  
  54.         for (int i = 0; i < getNeighbors().size() - 1; i++) {
  55.             for (GraphNode node : getNeighbors().keySet()) {
  56.                 for (Map.Entry<GraphNode, Integer> neighborEntry : node.getNeighbors().entrySet()) {
  57.                     int newDistance = distanceMap.get(node) + neighborEntry.getValue();
  58.                     if (newDistance < distanceMap.get(neighborEntry.getKey())) {
  59.                         distanceMap.put(neighborEntry.getKey(), newDistance);
  60.                         shortestPaths.get(neighborEntry.getKey()).clear();
  61.                         shortestPaths.get(neighborEntry.getKey()).addAll(shortestPaths.get(node));
  62.                         shortestPaths.get(neighborEntry.getKey()).add(neighborEntry.getKey());
  63.                     }
  64.                 }
  65.             }
  66.         }
  67.  
  68.         printShortestPaths(source, distanceMap, shortestPaths);
  69.  
  70.         return distanceMap;
  71.     }
  72.  
  73.     // Print shortest paths
  74.     private void printShortestPaths(GraphNode source, Map<GraphNode, Integer> distanceMap, Map<GraphNode, List<GraphNode>> shortestPaths) {
  75.         System.out.println("s d dist path");
  76.         System.out.println("---- ---- ------------ -------------------");
  77.        
  78.         for (GraphNode node : getNeighbors().keySet()) {
  79.             System.out.printf("%d %d %.4f %s%n", source.getId(), node.getId(), distanceMap.get(node) / 1.0,
  80.                     buildPathString(shortestPaths.get(node)));
  81.         }
  82.     }
  83.    
  84.     private String buildPathString(List<GraphNode> path) {
  85.         StringBuilder sb = new StringBuilder();
  86.         for (int i = 0; i < path.size(); i++) {
  87.             sb.append(path.get(i).getId());
  88.             if (i < path.size() - 1) {
  89.                 sb.append("->");
  90.             }
  91.         }
  92.         return sb.toString();
  93.     }
  94.  
  95.     @Override
  96.     public String toString() {
  97.         StringBuilder sb = new StringBuilder();
  98.         sb.append("ID: ").append(id).append(", Neighbors: [");
  99.         for (int neighborId : neighbors.keySet()) {
  100.             int weight = neighbors.get(neighborId);
  101.             sb.append(neighborId).append(" (Weight: ").append(weight).append("), ");
  102.         }
  103.         sb.append("]");
  104.         return sb.toString();
  105.     }
  106.  
  107. }
  108.  
  109.  
  110.  
  111. public class Esercizio4 {
  112.  
  113.     public static void main(String[] args) {
  114.  
  115.         GraphNode node0 = new GraphNode(0);
  116.         GraphNode node1 = new GraphNode(1);
  117.         GraphNode node2 = new GraphNode(2);
  118.         GraphNode node3 = new GraphNode(3);
  119.         GraphNode node4 = new GraphNode(4);
  120.         GraphNode node5 = new GraphNode(5);
  121.         GraphNode node6 = new GraphNode(6);
  122.         GraphNode node7 = new GraphNode(7);
  123.         GraphNode node8 = new GraphNode(8);
  124.         GraphNode node9 = new GraphNode(9);
  125.         GraphNode node10 = new GraphNode(10);
  126.         GraphNode node11 = new GraphNode(11);
  127.  
  128.         node0.addNeighbor(node1, 1);
  129.  
  130.         node1.addNeighbor(node11, 1);
  131.         node1.addNeighbor(node5, 4);
  132.         node1.addNeighbor(node4, 1);
  133.  
  134.         node2.addNeighbor(node8, 1);
  135.         node2.addNeighbor(node5, 1);
  136.  
  137.         node5.addNeighbor(node6, 1);
  138.  
  139.         node11.addNeighbor(node8, 1);
  140.  
  141.         node6.addNeighbor(node3, 1);
  142.         node6.addNeighbor(node4, 1);
  143.  
  144.         node4.addNeighbor(node7, 1);
  145.  
  146.         node7.addNeighbor(node9, 1);
  147.  
  148.         node9.addNeighbor(node10, 1);
  149.         node9.addNeighbor(node3, 1);
  150.  
  151.         node10.addNeighbor(node3, 1);
  152.  
  153.  
  154.  
  155.         //int weightFromNode1ToNode2 = node1.getWeightToNeighbor(node2);
  156.         //System.out.println("Weight from Node 1 to Node 2: " + weightFromNode1ToNode2);
  157.  
  158.         Map<GraphNode, Integer> distanceMap = node0.bellmanFordShortestPaths(node0);
  159.  
  160.         for (Map.Entry<GraphNode, Integer> entry : distanceMap.entrySet()) {
  161.             System.out.println("Shortest distance from Node 0 to Node " + entry.getKey().getId() + ": " + entry.getValue());
  162.         }
  163.     }
  164. }
Advertisement
Add Comment
Please, Sign In to add comment