diff --git a/Edge.java b/Edge.java index e877a3b..1072964 100644 --- a/Edge.java +++ b/Edge.java @@ -1,4 +1,4 @@ -public class Edge +public class Edge implements Comparable { private Node anfang; private Node ende; @@ -17,4 +17,10 @@ public class Edge public int getWert(){return this.wert;} public boolean istGerichtet(){return this.gerichtet;} + public int compareTo(Object o) { + Edge other = (Edge)o; + if(this.wert < other.wert)return -1; + if(this.wert > other.wert)return 1; + return 0; } +} \ No newline at end of file diff --git a/Graph.java b/Graph.java index 016a3e0..a297466 100644 --- a/Graph.java +++ b/Graph.java @@ -108,40 +108,89 @@ public class Graph n.vorgaenger = s; } } - - s.bearbeitet = true; - - while(true){ - Node next = null; - for (Node n : this.nodes){ - if (!n.bearbeitet) continue; - if (n.entfernung == -1) continue; - - if (next == null || next.entfernung > n.entfernung){ - next = n; - } - } - if (next == null) break; - edges = next.getEdges(); - for (Edge e : edges){ - Node n; - if (e.getAnfang() == s ) n= e.getEnde(); - else n = e.getAnfang(); - int neu = s.entfernung +e.getWert(); - if (n.entfernung==-1 || neu < n.entfernung){ - n.entfernung = neu; - n.vorgaenger = next; + s.bearbeitet = true; + + while(true){ + Node next = null; + for (Node n : this.nodes){ + if (!n.bearbeitet) continue; + if (n.entfernung == -1) continue; + + if (next == null || next.entfernung > n.entfernung){ + next = n; + } } + if (next == null) break; + edges = next.getEdges(); + for (Edge e : edges){ + Node n; + + if (e.getAnfang() == s ) n= e.getEnde(); + else n = e.getAnfang(); + int neu = s.entfernung +e.getWert(); + if (n.entfernung==-1 || neu < n.entfernung){ + n.entfernung = neu; + n.vorgaenger = next; + } + } + next.bearbeitet = true; } - next.bearbeitet = true; + Node z = this.getNode(ziel); + ArrayList ergebnis = new ArrayList (); + while (z != null){ + ergebnis.add(z); + z=z.vorgaenger; + } + return ergebnis; + } - Node z = this.getNode(ziel); - ArrayList ergebnis = new ArrayList (); - while (z != null){ - ergebnis.add(z); - z=z.vorgaenger; + + private boolean istBaum(int start){ + ArrayList ergebnis = new ArrayList(); + LinkedList q = new LinkedList(); + q.add(this.getNode(start)); + + while(!q.isEmpty()){ + Node aktuell = q.removeFirst(); + if (ergebnis.contains(aktuell)){ + return false; + } + + ArrayList erreichbar = aktuell.getTargets(); + Collections.sort(erreichbar); + q.addAll(erreichbar); + + ergebnis.add(aktuell); + } + return true; + } + + public Graph prim(){ + Graph sb = new Graph(); + for (Node n: this.nodes){ + sb.addNode(n.getNumber()); + } + + ArrayList available = new ArrayList(); + ArrayList done = new ArrayList(); + ArrayList added = new ArrayList(); + done.add(this.getNode(1)); + while(true){ + for (int i = 0; i < done.size(); i++){ + Node n = done.get(i); + for (Edge e : n.getEdges()){ + if (!done.contains(e.getEnde())||!added.contains(e))available.add(e); + } + Collections.sort(available); + } + if(available.isEmpty())break; + Edge p = available.get(0); + ArrayList erreichbar = sb.tiefensuche(1); + sb.addEdge(p); + added.add(p); + done.add(p.getEnde()); + } + return sb; } - return ergebnis; -} } diff --git a/Node.java b/Node.java index 17e9390..b665aa6 100644 --- a/Node.java +++ b/Node.java @@ -38,10 +38,10 @@ public class Node implements Comparable ArrayList t= new ArrayList(); for (Edge e : this.edges){ if(e.getAnfang()== this){ - edges.add(e); + t.add(e); } else if (!e.istGerichtet()){ - edges.add(e); + t.add(e); } } return t; diff --git a/test.java b/test.java index 78a6ab2..b1b4765 100644 --- a/test.java +++ b/test.java @@ -68,7 +68,7 @@ public static void test2(){ g.addEdge(4,2,5,false); g.addEdge(2,9,2,false); g.addEdge(9,8,4,false); - ArrayList