From 6947eee9e0defcc5c8922e3d86d88e290f07f24a Mon Sep 17 00:00:00 2001 From: SimonDHG <@> Date: Wed, 21 Feb 2024 11:06:47 +0100 Subject: [PATCH] fehler beim Kimmig --- Graph.java | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++-- Node.java | 28 ++++++++++++++- test.java | 30 +++++++++++++++- 3 files changed, 156 insertions(+), 5 deletions(-) diff --git a/Graph.java b/Graph.java index 6450187..016a3e0 100644 --- a/Graph.java +++ b/Graph.java @@ -1,4 +1,6 @@ import java.util.ArrayList; +import java.util.LinkedList; +import java.util.Collections; public class Graph { private ArrayList nodes; @@ -12,16 +14,17 @@ public class Graph public void addNode(Node n) { this.nodes.add(n); } - + public void addNode(int nr){ this.nodes.add(new Node(nr)); } - + public void addEdge(Edge e){ this.edges.add(e); e.getAnfang().addEdge(e); e.getEnde().addEdge(e); } + public void addEdge(int a, int e, int w, boolean g){ Node an = null; Node en = null; @@ -38,7 +41,7 @@ public class Graph } this.addEdge(new Edge(an, en, w, g)); } - + public Node getNode(int nr){ for (Node n : this.nodes){ if (n.getNumber() == nr){ @@ -47,4 +50,98 @@ public class Graph } return null; } + + public ArrayList breitensuche(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)){ + continue; + } + + ArrayList erreichbar = aktuell.getTargets(); + Collections.sort(erreichbar); + q.addAll(erreichbar); + + ergebnis.add(aktuell); + } + + return ergebnis; + } + + public ArrayList tiefensuche(int start){ + ArrayList ergebnis = new ArrayList(); + LinkedList q = new LinkedList(); + q.add(this.getNode(start)); + + while(!q.isEmpty()){ + Node aktuell = q.removeLast(); + if (ergebnis.contains(aktuell)){ + continue; + } + + ArrayList erreichbar = aktuell.getTargets(); + Collections.sort(erreichbar, Collections.reverseOrder()); + q.addAll(erreichbar); + + ergebnis.add(aktuell); + } + + return ergebnis; + } + + public ArrayList dijkstra (int start, int ziel){ + Node s = this.getNode(start); + s.entfernung=0; + ArrayList edges = s.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 = 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; + } + } + next.bearbeitet = true; + } + Node z = this.getNode(ziel); + ArrayList ergebnis = new ArrayList (); + while (z != null){ + ergebnis.add(z); + z=z.vorgaenger; + } + return ergebnis; +} } diff --git a/Node.java b/Node.java index daec6c1..17e9390 100644 --- a/Node.java +++ b/Node.java @@ -1,11 +1,18 @@ import java.util.ArrayList; -public class Node +public class Node implements Comparable { private int number; private ArrayList edges; + public int entfernung; + public Node vorgaenger; + public boolean bearbeitet; + public Node(int n){ this.number = n; this.edges = new ArrayList(); + + entfernung = -1; + vorgaenger = null; } public int getNumber (){return this.number;} @@ -26,4 +33,23 @@ public class Node } return t; } + + public ArrayList getEdges(){ + ArrayList t= new ArrayList(); + for (Edge e : this.edges){ + if(e.getAnfang()== this){ + edges.add(e); + } + else if (!e.istGerichtet()){ + edges.add(e); + } + } + return t; + } + public int compareTo(Object o) { + Node other = (Node)o; + if(this.number < other.number)return -1; + if(this.number > other.number)return 1; + return 0; + } } diff --git a/test.java b/test.java index 5c450bc..78a6ab2 100644 --- a/test.java +++ b/test.java @@ -1,4 +1,5 @@ import java.util.ArrayList; +import java.util.Collections; public class test { public static void test(){ @@ -38,9 +39,36 @@ public class test Node n = g.getNode(16); ArrayList targets = n.getTargets(); - for (Node target : targets){ + Collections.sort(targets); + /*for (Node target : targets){ System.out.println(target.getNumber()); } + ArrayList b = g.breitensuche(1); + for (Node t: b){ + System.out.println(t.getNumber()); + }*/ + ArrayList t = g.tiefensuche(21); + for (Node r: t){ + System.out.println(r.getNumber()); + } +} +public static void test2(){ + Graph g = new Graph(); + for(int i = 1; i <= 9 ; i++){ + g.addNode(i); + } + g.addEdge(1,6,4,false); + g.addEdge(6,7,2,false); + g.addEdge(1,3,3,false); + g.addEdge(6,5,4,false); + g.addEdge(7,9,1,false); + g.addEdge(5,4,2,false); + g.addEdge(5,2,3,false); + g.addEdge(3,4,6,false); + g.addEdge(4,2,5,false); + g.addEdge(2,9,2,false); + g.addEdge(9,8,4,false); + ArrayList