From 58ee75743659b8fe72a21aff0e6e8200c8b0698b Mon Sep 17 00:00:00 2001 From: pazis Date: Wed, 20 Nov 2019 22:20:02 +0000 Subject: [PATCH 1/4] aaa --- .../com/baeldung/algorithms/prim/Edge.java | 37 +++++++ .../com/baeldung/algorithms/prim/Prim.java | 74 +++++++++++++ .../com/baeldung/algorithms/prim/Vertex.java | 101 ++++++++++++++++++ .../baeldung/algorithms/prim/PrimTest.java | 55 ++++++++++ 4 files changed, 267 insertions(+) create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java create mode 100644 algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimTest.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java new file mode 100644 index 0000000000..3720536df7 --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java @@ -0,0 +1,37 @@ +package com.baeldung.algorithms.prim; + +public class Edge { + + private int weight; + private boolean isIncluded = false; + private boolean isPrinted = false; + + public Edge (int weight){ + this.weight = weight; + } + + public int getWeight() { + return weight; + } + + public void setWeight(int weight) { + this.weight = weight; + } + + public boolean isIncluded() { + return isIncluded; + } + + public void setIncluded(boolean included) { + isIncluded = included; + } + + public boolean isPrinted() { + return isPrinted; + } + + public void setPrinted(boolean printed) { + isPrinted = printed; + } +} + diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java new file mode 100644 index 0000000000..944ad4e66c --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java @@ -0,0 +1,74 @@ +package com.baeldung.algorithms.prim; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.commons.math3.util.Pair; + +public class Prim { + + private List graph; + + public Prim(List graph){ + this.graph = graph; + } + + public void run(){ + if (graph.size() > 0){ + graph.get(0).setVisited(true); + } + while (isDisconnected()){ + Edge nextMinimum = new Edge(Integer.MAX_VALUE); + Vertex nextVertex = graph.get(0); + for (Vertex vertex : graph){ + if (vertex.isVisited()){ + Pair candidate = vertex.nextMinimum(); + if (candidate.getValue().getWeight() < nextMinimum.getWeight()){ + nextMinimum = candidate.getValue(); + nextVertex = candidate.getKey(); + } + } + } + nextMinimum.setIncluded(true); + nextVertex.setVisited(true); + } + } + + private boolean isDisconnected(){ + for (Vertex vertex : graph){ + if (!vertex.isVisited()){ + return true; + } + } + return false; + } + + public String originalGraphToString(){ + StringBuilder sb = new StringBuilder(); + for (Vertex vertex : graph){ + sb.append(vertex.originalToString()); + } + return sb.toString(); + } + + public void resetPrintHistory(){ + for (Vertex vertex : graph){ + Iterator it = vertex.getEdges().entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = (Map.Entry) it.next(); + ((Edge)pair.getValue()).setPrinted(false); + } + } + } + + public String minimumSpanningTreeToString(){ + StringBuilder sb = new StringBuilder(); + for (Vertex vertex : graph){ + sb.append(vertex.includedToString()); + } + return sb.toString(); + } + +} + diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java new file mode 100644 index 0000000000..0bb2454a1f --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java @@ -0,0 +1,101 @@ +package com.baeldung.algorithms.prim; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.apache.commons.math3.util.Pair; + +public class Vertex { + + private String label = null; + private Map edges = new HashMap<>(); + private boolean isVisited = false; + + public Vertex(String label){ + this.label = label; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public Map getEdges() { + return edges; + } + + public void addEdge(Vertex vertex, Edge edge){ + this.edges.put(vertex, edge); + } + + public boolean isVisited() { + return isVisited; + } + + public void setVisited(boolean visited) { + isVisited = visited; + } + + public Pair nextMinimum(){ + Edge nextMinimum = new Edge(Integer.MAX_VALUE); + Vertex nextVertex = this; + Iterator it = edges.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = (Map.Entry) it.next(); + if (!((Vertex)pair.getKey()).isVisited()){ + if (!((Edge)pair.getValue()).isIncluded()) { + if (((Edge) pair.getValue()).getWeight() < nextMinimum.getWeight()) { + nextMinimum = (Edge) pair.getValue(); + nextVertex = (Vertex) pair.getKey(); + } + } + } + } + return new Pair<>(nextVertex, nextMinimum); + } + + public String originalToString(){ + StringBuilder sb = new StringBuilder(); + Iterator it = edges.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = (Map.Entry) it.next(); + if (!((Edge)pair.getValue()).isPrinted()) { + sb.append(getLabel()); + sb.append(" --- "); + sb.append(((Edge) pair.getValue()).getWeight()); + sb.append(" --- "); + sb.append(((Vertex) pair.getKey()).getLabel()); + sb.append("\n"); + ((Edge) pair.getValue()).setPrinted(true); + } + } + return sb.toString(); + } + + public String includedToString(){ + StringBuilder sb = new StringBuilder(); + if (isVisited()) { + Iterator it = edges.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = (Map.Entry) it.next(); + if (((Edge) pair.getValue()).isIncluded()) { + if (!((Edge)pair.getValue()).isPrinted()) { + sb.append(getLabel()); + sb.append(" --- "); + sb.append(((Edge) pair.getValue()).getWeight()); + sb.append(" --- "); + sb.append(((Vertex) pair.getKey()).getLabel()); + sb.append("\n"); + ((Edge) pair.getValue()).setPrinted(true); + } + } + } + } + return sb.toString(); + } +} + diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimTest.java new file mode 100644 index 0000000000..45a80e4900 --- /dev/null +++ b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimTest.java @@ -0,0 +1,55 @@ +package com.baeldung.algorithms.prim; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +public class PrimTest { + + @Test + public void givenAGraph_whenPrimRuns_thenPrintMST() { + Prim prim = new Prim(createGraph()); + System.out.println(prim.originalGraphToString()); + System.out.println("----------------"); + prim.run(); + System.out.println(); + prim.resetPrintHistory(); + System.out.println(prim.minimumSpanningTreeToString()); + } + + public static List createGraph(){ + List graph = new ArrayList<>(); + Vertex a = new Vertex("A"); + Vertex b = new Vertex("B"); + Vertex c = new Vertex("C"); + Vertex d = new Vertex("D"); + Vertex e = new Vertex("E"); + Edge ab = new Edge(2); + a.addEdge(b, ab); + b.addEdge(a, ab); + Edge ac = new Edge(3); + a.addEdge(c, ac); + c.addEdge(a, ac); + Edge bc = new Edge(2); + b.addEdge(c, bc); + c.addEdge(b, bc); + Edge be = new Edge(5); + b.addEdge(e, be); + e.addEdge(b, be); + Edge cd = new Edge(1); + c.addEdge(d, cd); + d.addEdge(c, cd); + Edge ce = new Edge(1); + c.addEdge(e, ce); + e.addEdge(c, ce); + graph.add(a); + graph.add(b); + graph.add(c); + graph.add(d); + graph.add(e); + return graph; + } + +} + From d1bd33f862b7918c9087268d385b3e791d7ebedb Mon Sep 17 00:00:00 2001 From: pazis Date: Wed, 20 Nov 2019 22:27:17 +0000 Subject: [PATCH 2/4] fix --- .../algorithms/prim/{PrimTest.java => PrimUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/{PrimTest.java => PrimUnitTest.java} (98%) diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java similarity index 98% rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimTest.java rename to algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java index 45a80e4900..548fe2c877 100644 --- a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimTest.java +++ b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java @@ -5,7 +5,7 @@ import java.util.List; import org.junit.Test; -public class PrimTest { +public class PrimUnitTest { @Test public void givenAGraph_whenPrimRuns_thenPrintMST() { From 24859d45aba036e6e0c30af36a39e6ec35edb889 Mon Sep 17 00:00:00 2001 From: pazis Date: Sun, 24 Nov 2019 18:40:13 +0000 Subject: [PATCH 3/4] addEdge fix --- .../com/baeldung/algorithms/prim/Edge.java | 3 +- .../com/baeldung/algorithms/prim/Prim.java | 43 ++++++++++--------- .../com/baeldung/algorithms/prim/Vertex.java | 28 ++++++------ .../algorithms/prim/PrimUnitTest.java | 3 +- 4 files changed, 40 insertions(+), 37 deletions(-) diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java index 3720536df7..52ec4ef534 100644 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java @@ -6,7 +6,7 @@ public class Edge { private boolean isIncluded = false; private boolean isPrinted = false; - public Edge (int weight){ + public Edge(int weight) { this.weight = weight; } @@ -34,4 +34,3 @@ public class Edge { isPrinted = printed; } } - diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java index 944ad4e66c..ec97e34341 100644 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java @@ -10,21 +10,23 @@ public class Prim { private List graph; - public Prim(List graph){ + public Prim(List graph) { this.graph = graph; } - public void run(){ - if (graph.size() > 0){ - graph.get(0).setVisited(true); + public void run() { + if (graph.size() > 0) { + graph.get(0) + .setVisited(true); } - while (isDisconnected()){ + while (isDisconnected()) { Edge nextMinimum = new Edge(Integer.MAX_VALUE); Vertex nextVertex = graph.get(0); - for (Vertex vertex : graph){ - if (vertex.isVisited()){ + for (Vertex vertex : graph) { + if (vertex.isVisited()) { Pair candidate = vertex.nextMinimum(); - if (candidate.getValue().getWeight() < nextMinimum.getWeight()){ + if (candidate.getValue() + .getWeight() < nextMinimum.getWeight()) { nextMinimum = candidate.getValue(); nextVertex = candidate.getKey(); } @@ -35,40 +37,41 @@ public class Prim { } } - private boolean isDisconnected(){ - for (Vertex vertex : graph){ - if (!vertex.isVisited()){ + private boolean isDisconnected() { + for (Vertex vertex : graph) { + if (!vertex.isVisited()) { return true; } } return false; } - public String originalGraphToString(){ + public String originalGraphToString() { StringBuilder sb = new StringBuilder(); - for (Vertex vertex : graph){ + for (Vertex vertex : graph) { sb.append(vertex.originalToString()); } return sb.toString(); } - public void resetPrintHistory(){ - for (Vertex vertex : graph){ - Iterator it = vertex.getEdges().entrySet().iterator(); + public void resetPrintHistory() { + for (Vertex vertex : graph) { + Iterator it = vertex.getEdges() + .entrySet() + .iterator(); while (it.hasNext()) { Map.Entry pair = (Map.Entry) it.next(); - ((Edge)pair.getValue()).setPrinted(false); + ((Edge) pair.getValue()).setPrinted(false); } } } - public String minimumSpanningTreeToString(){ + public String minimumSpanningTreeToString() { StringBuilder sb = new StringBuilder(); - for (Vertex vertex : graph){ + for (Vertex vertex : graph) { sb.append(vertex.includedToString()); } return sb.toString(); } } - diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java index 0bb2454a1f..e2b7d90638 100644 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java @@ -12,7 +12,7 @@ public class Vertex { private Map edges = new HashMap<>(); private boolean isVisited = false; - public Vertex(String label){ + public Vertex(String label) { this.label = label; } @@ -28,7 +28,7 @@ public class Vertex { return edges; } - public void addEdge(Vertex vertex, Edge edge){ + public void addEdge(Vertex vertex, Edge edge) { this.edges.put(vertex, edge); } @@ -40,14 +40,15 @@ public class Vertex { isVisited = visited; } - public Pair nextMinimum(){ + public Pair nextMinimum() { Edge nextMinimum = new Edge(Integer.MAX_VALUE); Vertex nextVertex = this; - Iterator it = edges.entrySet().iterator(); + Iterator it = edges.entrySet() + .iterator(); while (it.hasNext()) { Map.Entry pair = (Map.Entry) it.next(); - if (!((Vertex)pair.getKey()).isVisited()){ - if (!((Edge)pair.getValue()).isIncluded()) { + if (!((Vertex) pair.getKey()).isVisited()) { + if (!((Edge) pair.getValue()).isIncluded()) { if (((Edge) pair.getValue()).getWeight() < nextMinimum.getWeight()) { nextMinimum = (Edge) pair.getValue(); nextVertex = (Vertex) pair.getKey(); @@ -58,12 +59,13 @@ public class Vertex { return new Pair<>(nextVertex, nextMinimum); } - public String originalToString(){ + public String originalToString() { StringBuilder sb = new StringBuilder(); - Iterator it = edges.entrySet().iterator(); + Iterator it = edges.entrySet() + .iterator(); while (it.hasNext()) { Map.Entry pair = (Map.Entry) it.next(); - if (!((Edge)pair.getValue()).isPrinted()) { + if (!((Edge) pair.getValue()).isPrinted()) { sb.append(getLabel()); sb.append(" --- "); sb.append(((Edge) pair.getValue()).getWeight()); @@ -76,14 +78,15 @@ public class Vertex { return sb.toString(); } - public String includedToString(){ + public String includedToString() { StringBuilder sb = new StringBuilder(); if (isVisited()) { - Iterator it = edges.entrySet().iterator(); + Iterator it = edges.entrySet() + .iterator(); while (it.hasNext()) { Map.Entry pair = (Map.Entry) it.next(); if (((Edge) pair.getValue()).isIncluded()) { - if (!((Edge)pair.getValue()).isPrinted()) { + if (!((Edge) pair.getValue()).isPrinted()) { sb.append(getLabel()); sb.append(" --- "); sb.append(((Edge) pair.getValue()).getWeight()); @@ -98,4 +101,3 @@ public class Vertex { return sb.toString(); } } - diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java index 548fe2c877..41e53fc9f2 100644 --- a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java +++ b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java @@ -18,7 +18,7 @@ public class PrimUnitTest { System.out.println(prim.minimumSpanningTreeToString()); } - public static List createGraph(){ + public static List createGraph() { List graph = new ArrayList<>(); Vertex a = new Vertex("A"); Vertex b = new Vertex("B"); @@ -52,4 +52,3 @@ public class PrimUnitTest { } } - From 514e6de3731ad490f86e293c7720120927906955 Mon Sep 17 00:00:00 2001 From: pazis Date: Thu, 5 Dec 2019 14:05:20 +0000 Subject: [PATCH 4/4] iterator fix --- .../com/baeldung/algorithms/prim/Prim.java | 150 ++++++------- .../com/baeldung/algorithms/prim/Vertex.java | 209 +++++++++--------- 2 files changed, 179 insertions(+), 180 deletions(-) diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java index ec97e34341..365dca6b62 100644 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java @@ -1,77 +1,73 @@ -package com.baeldung.algorithms.prim; - -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.apache.commons.math3.util.Pair; - -public class Prim { - - private List graph; - - public Prim(List graph) { - this.graph = graph; - } - - public void run() { - if (graph.size() > 0) { - graph.get(0) - .setVisited(true); - } - while (isDisconnected()) { - Edge nextMinimum = new Edge(Integer.MAX_VALUE); - Vertex nextVertex = graph.get(0); - for (Vertex vertex : graph) { - if (vertex.isVisited()) { - Pair candidate = vertex.nextMinimum(); - if (candidate.getValue() - .getWeight() < nextMinimum.getWeight()) { - nextMinimum = candidate.getValue(); - nextVertex = candidate.getKey(); - } - } - } - nextMinimum.setIncluded(true); - nextVertex.setVisited(true); - } - } - - private boolean isDisconnected() { - for (Vertex vertex : graph) { - if (!vertex.isVisited()) { - return true; - } - } - return false; - } - - public String originalGraphToString() { - StringBuilder sb = new StringBuilder(); - for (Vertex vertex : graph) { - sb.append(vertex.originalToString()); - } - return sb.toString(); - } - - public void resetPrintHistory() { - for (Vertex vertex : graph) { - Iterator it = vertex.getEdges() - .entrySet() - .iterator(); - while (it.hasNext()) { - Map.Entry pair = (Map.Entry) it.next(); - ((Edge) pair.getValue()).setPrinted(false); - } - } - } - - public String minimumSpanningTreeToString() { - StringBuilder sb = new StringBuilder(); - for (Vertex vertex : graph) { - sb.append(vertex.includedToString()); - } - return sb.toString(); - } - -} +package com.baeldung.algorithms.prim; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.commons.math3.util.Pair; + +public class Prim { + + private List graph; + + public Prim(List graph){ + this.graph = graph; + } + + public void run(){ + if (graph.size() > 0){ + graph.get(0).setVisited(true); + } + while (isDisconnected()){ + Edge nextMinimum = new Edge(Integer.MAX_VALUE); + Vertex nextVertex = graph.get(0); + for (Vertex vertex : graph){ + if (vertex.isVisited()){ + Pair candidate = vertex.nextMinimum(); + if (candidate.getValue().getWeight() < nextMinimum.getWeight()){ + nextMinimum = candidate.getValue(); + nextVertex = candidate.getKey(); + } + } + } + nextMinimum.setIncluded(true); + nextVertex.setVisited(true); + } + } + + private boolean isDisconnected(){ + for (Vertex vertex : graph){ + if (!vertex.isVisited()){ + return true; + } + } + return false; + } + + public String originalGraphToString(){ + StringBuilder sb = new StringBuilder(); + for (Vertex vertex : graph){ + sb.append(vertex.originalToString()); + } + return sb.toString(); + } + + public void resetPrintHistory(){ + for (Vertex vertex : graph){ + Iterator> it = vertex.getEdges().entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = it.next(); + pair.getValue().setPrinted(false); + } + } + } + + public String minimumSpanningTreeToString(){ + StringBuilder sb = new StringBuilder(); + for (Vertex vertex : graph){ + sb.append(vertex.includedToString()); + } + return sb.toString(); + } + +} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java index e2b7d90638..982d9331bc 100644 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java @@ -1,103 +1,106 @@ -package com.baeldung.algorithms.prim; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import org.apache.commons.math3.util.Pair; - -public class Vertex { - - private String label = null; - private Map edges = new HashMap<>(); - private boolean isVisited = false; - - public Vertex(String label) { - this.label = label; - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public Map getEdges() { - return edges; - } - - public void addEdge(Vertex vertex, Edge edge) { - this.edges.put(vertex, edge); - } - - public boolean isVisited() { - return isVisited; - } - - public void setVisited(boolean visited) { - isVisited = visited; - } - - public Pair nextMinimum() { - Edge nextMinimum = new Edge(Integer.MAX_VALUE); - Vertex nextVertex = this; - Iterator it = edges.entrySet() - .iterator(); - while (it.hasNext()) { - Map.Entry pair = (Map.Entry) it.next(); - if (!((Vertex) pair.getKey()).isVisited()) { - if (!((Edge) pair.getValue()).isIncluded()) { - if (((Edge) pair.getValue()).getWeight() < nextMinimum.getWeight()) { - nextMinimum = (Edge) pair.getValue(); - nextVertex = (Vertex) pair.getKey(); - } - } - } - } - return new Pair<>(nextVertex, nextMinimum); - } - - public String originalToString() { - StringBuilder sb = new StringBuilder(); - Iterator it = edges.entrySet() - .iterator(); - while (it.hasNext()) { - Map.Entry pair = (Map.Entry) it.next(); - if (!((Edge) pair.getValue()).isPrinted()) { - sb.append(getLabel()); - sb.append(" --- "); - sb.append(((Edge) pair.getValue()).getWeight()); - sb.append(" --- "); - sb.append(((Vertex) pair.getKey()).getLabel()); - sb.append("\n"); - ((Edge) pair.getValue()).setPrinted(true); - } - } - return sb.toString(); - } - - public String includedToString() { - StringBuilder sb = new StringBuilder(); - if (isVisited()) { - Iterator it = edges.entrySet() - .iterator(); - while (it.hasNext()) { - Map.Entry pair = (Map.Entry) it.next(); - if (((Edge) pair.getValue()).isIncluded()) { - if (!((Edge) pair.getValue()).isPrinted()) { - sb.append(getLabel()); - sb.append(" --- "); - sb.append(((Edge) pair.getValue()).getWeight()); - sb.append(" --- "); - sb.append(((Vertex) pair.getKey()).getLabel()); - sb.append("\n"); - ((Edge) pair.getValue()).setPrinted(true); - } - } - } - } - return sb.toString(); - } -} +package com.baeldung.algorithms.prim; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.apache.commons.math3.util.Pair; + +public class Vertex { + + private String label = null; + private Map edges = new HashMap<>(); + private boolean isVisited = false; + + public Vertex(String label){ + this.label = label; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public Map getEdges() { + return edges; + } + + public void addEdge(Vertex vertex, Edge edge){ + if (this.edges.containsKey(vertex)){ + if (edge.getWeight() < this.edges.get(vertex).getWeight()){ + this.edges.replace(vertex, edge); + } + } else { + this.edges.put(vertex, edge); + } + } + + public boolean isVisited() { + return isVisited; + } + + public void setVisited(boolean visited) { + isVisited = visited; + } + + public Pair nextMinimum(){ + Edge nextMinimum = new Edge(Integer.MAX_VALUE); + Vertex nextVertex = this; + Iterator> it = edges.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = it.next(); + if (!pair.getKey().isVisited()){ + if (!pair.getValue().isIncluded()) { + if (pair.getValue().getWeight() < nextMinimum.getWeight()) { + nextMinimum = pair.getValue(); + nextVertex = pair.getKey(); + } + } + } + } + return new Pair<>(nextVertex, nextMinimum); + } + + public String originalToString(){ + StringBuilder sb = new StringBuilder(); + Iterator> it = edges.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = it.next(); + if (!pair.getValue().isPrinted()) { + sb.append(getLabel()); + sb.append(" --- "); + sb.append(pair.getValue().getWeight()); + sb.append(" --- "); + sb.append(pair.getKey().getLabel()); + sb.append("\n"); + pair.getValue().setPrinted(true); + } + } + return sb.toString(); + } + + public String includedToString(){ + StringBuilder sb = new StringBuilder(); + if (isVisited()) { + Iterator> it = edges.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = it.next(); + if (pair.getValue().isIncluded()) { + if (!pair.getValue().isPrinted()) { + sb.append(getLabel()); + sb.append(" --- "); + sb.append(pair.getValue().getWeight()); + sb.append(" --- "); + sb.append(pair.getKey().getLabel()); + sb.append("\n"); + pair.getValue().setPrinted(true); + } + } + } + } + return sb.toString(); + } +}