From 42a6157dc0889d346e4aa8aabd61414076867885 Mon Sep 17 00:00:00 2001
From: Gianluca <gianlucamastrolonardo10@gmail.com>
Date: Mon, 6 May 2024 16:52:40 +0200
Subject: [PATCH] da finire

---
 .../Es2/Test/TestAllacciamentoIdrico.java     |  8 ++--
 .../Lab7/Es2/src/AllacciamentoIdrico.java     | 40 +++++++++++++------
 .../Laboratorio/Lab7/Es2/src/Dijkstra.java    | 27 +++++++++++--
 .../Laboratorio/Lab7/Es2/src/Prim.java        | 19 +++++++--
 4 files changed, 71 insertions(+), 23 deletions(-)

diff --git a/Algoritmi_2/Laboratorio/Lab7/Es2/Test/TestAllacciamentoIdrico.java b/Algoritmi_2/Laboratorio/Lab7/Es2/Test/TestAllacciamentoIdrico.java
index e2074c9..446e7a4 100644
--- a/Algoritmi_2/Laboratorio/Lab7/Es2/Test/TestAllacciamentoIdrico.java
+++ b/Algoritmi_2/Laboratorio/Lab7/Es2/Test/TestAllacciamentoIdrico.java
@@ -7,7 +7,8 @@ class TestAllacciamentoIdrico {
     AllacciamentoIdrico allId;
 
     @Test
-    public void testCreate() {
+    public
+    void testCreate() {
         UndirectedGraph mappa = new UndirectedGraph("4;1 2 2;1 0 5;2 3 3; 0 3 1");
         int[][] costoScavo = {{0, 6, -1, 8}, {6, 0, 7, -1}, {-1, 7, 0, 10}, {8, -1, 10, 0}};
         int costoTubo = 3;
@@ -17,7 +18,8 @@ class TestAllacciamentoIdrico {
     }
 
     @Test
-    public void test01() {
+    public
+    void test01() {
         UndirectedGraph mappa = new UndirectedGraph("4;1 2 2;1 0 5;2 3 3; 0 3 1");
         int[][] costoScavo = {{0, 6, -1, 8}, {6, 0, 7, -1}, {-1, 7, 0, 10}, {8, -1, 10, 0}};
         int costoTubo = 3;
@@ -28,7 +30,7 @@ class TestAllacciamentoIdrico {
         Assertions.assertTrue(!allId.progettoComune().hasEdge(2, 3));
         Assertions.assertTrue(allId.progettoProprietari().hasEdge(2, 3));
         Assertions.assertTrue(!allId.progettoProprietari().hasEdge(0, 3));
-        //Assertions.assertEquals(2, allId.speseExtraComune());
+        Assertions.assertEquals(2, allId.speseExtraComune());
         // Assertions.assertEquals(3, allId.speseExtraProprietario(3));
     }
 
diff --git a/Algoritmi_2/Laboratorio/Lab7/Es2/src/AllacciamentoIdrico.java b/Algoritmi_2/Laboratorio/Lab7/Es2/src/AllacciamentoIdrico.java
index e0502d3..ba36df3 100644
--- a/Algoritmi_2/Laboratorio/Lab7/Es2/src/AllacciamentoIdrico.java
+++ b/Algoritmi_2/Laboratorio/Lab7/Es2/src/AllacciamentoIdrico.java
@@ -1,18 +1,32 @@
 import it.uniupo.graphLib.Edge;
 import it.uniupo.graphLib.UndirectedGraph;
 
-public class AllacciamentoIdrico {
+public
+class AllacciamentoIdrico {
     private UndirectedGraph mappa;
     private final int[][] costoScavo;
     private final int costoTubo;
     private final int puntoAllacciamento;
 
+    private final UndirectedGraph mappaCostiScavi;
 
-    public AllacciamentoIdrico(UndirectedGraph mappa, int[][] costoScavo, int costoTubo, int puntoAllacciamento) {
+
+    public
+    AllacciamentoIdrico(UndirectedGraph mappa, int[][] costoScavo, int costoTubo, int puntoAllacciamento) {
         this.mappa = mappa;
         this.costoScavo = costoScavo;
         this.costoTubo = costoTubo;
         this.puntoAllacciamento = puntoAllacciamento;
+        mappaCostiScavi = (UndirectedGraph) mappa.create();
+        for (int i = 0; i < costoScavo.length; ++i) {
+            for (int j = 0; j < costoScavo[i].length; ++j) {
+                if (i != j && costoScavo[i][j] != -1) {
+                    if (!mappaCostiScavi.hasEdge(i, j)) {
+                        mappaCostiScavi.addEdge(i, j, costoScavo[i][j]);
+                    }
+                }
+            }
+        }
     }
 
     //Ai proprietari conviene Dijkstra, perché hanno il cammino minimo
@@ -21,19 +35,21 @@ public class AllacciamentoIdrico {
         return dijkstra.getDijkstraTree(puntoAllacciamento);
     }
 
+
+    public
     UndirectedGraph progettoComune() {
         //Uso l'MST ma non usi pesi normali ma uso il costo dello scavo
-        UndirectedGraph mappaCostiScavi = (UndirectedGraph) mappa.create();
-        for (int i = 0; i < costoScavo.length; ++i) {
-            for (int j = 0; j < costoScavo[i].length; ++j) {
-                if (i != j && costoScavo[i][j] != -1) {
-                    if (!mappaCostiScavi.hasEdge(i, j)) {
-                        mappaCostiScavi.addEdge(i, j, costoScavo[i][j]);
-                    }
-                }
-            }
-        }
         Prim prim = new Prim(mappaCostiScavi);
         return prim.getMST();
     }
+
+    public
+    int speseExtraComune() {
+        Dijkstra dijkstra = new Dijkstra(mappaCostiScavi);
+        Prim prim = new Prim(mappaCostiScavi);
+        System.out.println("Comune: " + dijkstra.getDijkstraSize(puntoAllacciamento));
+        System.out.println("Propietari: " + prim.getMSTSize());
+
+        return dijkstra.getDijkstraSize(puntoAllacciamento) - prim.getMSTSize();
+    }
 }
diff --git a/Algoritmi_2/Laboratorio/Lab7/Es2/src/Dijkstra.java b/Algoritmi_2/Laboratorio/Lab7/Es2/src/Dijkstra.java
index dd25b1f..2c5b158 100644
--- a/Algoritmi_2/Laboratorio/Lab7/Es2/src/Dijkstra.java
+++ b/Algoritmi_2/Laboratorio/Lab7/Es2/src/Dijkstra.java
@@ -9,19 +9,22 @@ import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.Queue;
 
-public class Dijkstra {
+public
+class Dijkstra {
 
     private UndirectedGraph myGraph;
     private boolean[] founded;
 
 
-    public Dijkstra(UndirectedGraph graph) {
+    public
+    Dijkstra(UndirectedGraph graph) {
         this.myGraph = graph;
         this.founded = new boolean[this.myGraph.getOrder()];
     }
 
-    public UndirectedGraph getDijkstraTree(int sorg) {
-        UndirectedGraph dijkstraTree = (UndirectedGraph) myGraph.create();
+    private
+    int dijkstra(int sorg, UndirectedGraph dijkstraTree) {
+        int size = 0;
         int[] distance = new int[myGraph.getOrder()];
         Arrays.fill(distance, -1);
 
@@ -40,14 +43,30 @@ public class Dijkstra {
             if (!founded[nodeW]) {
                 founded[nodeW] = true;
                 distance[nodeW] = distance[nodeU] + heapReturnedEdge.getWeight();
+                size += heapReturnedEdge.getWeight();
                 dijkstraTree.addEdge(heapReturnedEdge);
                 for (Edge e : myGraph.getOutEdges(nodeW)) {
                     heap.add(e, distance[nodeW] + e.getWeight());
                 }
             }
         }
+        return size;
+    }
+
+    public
+    UndirectedGraph getDijkstraTree(int sorg) {
+        Arrays.fill(founded, false);
+        UndirectedGraph dijkstraTree = (UndirectedGraph) myGraph.create();
+        dijkstra(sorg, dijkstraTree);
         return dijkstraTree;
     }
 
+    public
+    int getDijkstraSize(int sorg) {
+        Arrays.fill(founded, false);
+        UndirectedGraph dijkstraTree = (UndirectedGraph) myGraph.create();
+        return dijkstra(sorg, dijkstraTree);
+    }
+
 
 }
\ No newline at end of file
diff --git a/Algoritmi_2/Laboratorio/Lab7/Es2/src/Prim.java b/Algoritmi_2/Laboratorio/Lab7/Es2/src/Prim.java
index 16c98e4..840d4b5 100644
--- a/Algoritmi_2/Laboratorio/Lab7/Es2/src/Prim.java
+++ b/Algoritmi_2/Laboratorio/Lab7/Es2/src/Prim.java
@@ -5,17 +5,20 @@ import it.uniupo.graphLib.UndirectedGraph;
 
 import java.util.Arrays;
 
-public class Prim {
+public
+class Prim {
 
     private UndirectedGraph myGraph;
     private boolean[] founded;
 
-    public Prim(UndirectedGraph g) {
+    public
+    Prim(UndirectedGraph g) {
         this.myGraph = g;
         this.founded = new boolean[myGraph.getOrder()];
     }
 
-    private int prim(int sorg, UndirectedGraph MST) {
+    private
+    int prim(int sorg, UndirectedGraph MST) {
         int cost = 0;
         founded[sorg] = true;
         MinHeap<Edge, Integer> heap = new MinHeap<>();
@@ -39,10 +42,18 @@ public class Prim {
         return cost;
     }
 
-    public UndirectedGraph getMST() {
+    public
+    UndirectedGraph getMST() {
         Arrays.fill(founded, false);
         UndirectedGraph MST = (UndirectedGraph) myGraph.create();
         prim(0, MST);
         return MST;
     }
+
+    public
+    int getMSTSize() {
+        Arrays.fill(founded, false);
+        UndirectedGraph MST = (UndirectedGraph) myGraph.create();
+        return prim(0, MST);
+    }
 }
-- 
GitLab