diff --git a/Algoritmi_2/Laboratorio/Lab7/Es2/Test/TestAllacciamentoIdrico.java b/Algoritmi_2/Laboratorio/Lab7/Es2/Test/TestAllacciamentoIdrico.java index e2074c93ada0271684d7732fd94713315a16d679..446e7a473bef7aa5dac086d40f2bb5dc4ebf3645 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 e0502d3e06e3c1b73d83c382791275a6f22281db..ba36df309442da9b1cdcc935db5f7a6b5ec8991e 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 dd25b1fac8fe0f300ea9ed323a5c2eb91c87541e..2c5b158431e8b791a69f3674ed9e477e167e1208 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 16c98e4f7778b5f40a31edf90a19c74c17e4975e..840d4b5b7016f8c892b0af2b43a3fa6997ba2bac 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); + } }