1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
import java.util.*;
import fhw.ADSTool;
/**
* Aufgabe2:
* Berechnet den kuerzesten Weg zwischen 2 Knoten
* @author Torben Brodt & Marco May
*
*/
public class A2 {
/**
* Mainmethode
* @param args - Kommandozeilenparameter
*/
public static void main(String[] args) {
Graph g = new Graph();
String[] werte = ADSTool.readStringArray(args.length == 0 ? "u12a2entf.dat" : args[0]);
String start = args.length == 0 ? "Frankfurt/Main" : args[1];
String ende = args.length == 0 ? "Augsburg" : args[2];
for (int i = 0; i < werte.length - 2; i += 3) {
if (!g.containsNode(werte[i])) // Stadt1
g.addNode(werte[i]);
if (!g.containsNode(werte[i + 1])) // Stadt2
g.addNode(werte[i + 1]);
if(!g.containsEdge(werte[i + 1], werte[i]))
g.addDoubleEdge(werte[i + 1], werte[i], Integer.parseInt(werte[i + 2]));
}
//g.show();
System.out.println(shortestPath(g,start,ende));
}
/**
* Berechnet die k�rzeste Strecke zwischen Start und Zielpunkt
* Anmerk.: In Zusammenarbeit mit Jarek Janas
* @param g - Erstellter Graph
* @param start -Startstring
* @param ziel -Zielstring
* @return Liste der gegangenen Knoten
*/
private static List<String> shortestPath(Graph g, String start, String ziel) {
Heap myHeap = new Heap(g, start);
List<String> l = new LinkedList<String>();
while (!myHeap.getSmallestNode().equals(ziel) && myHeap.getDistance(myHeap.getSmallestNode()) != Integer.MAX_VALUE) {
String stadtname = myHeap.getSmallestNode();
int wegZuDieserStadt = myHeap.getDistance(stadtname);
int naechsterWert, val;
myHeap.deleteNode(stadtname);
for (Iterator<String> eit = g.edgeIterator(stadtname); eit.hasNext() ;) {
//Von dieser Stadt werden alle verknuepften Staedte geladen (bzw. Knoten wird expandiert)
//Die Edges/Values werden verglichen und der kuerzeste Weg gesucht
String verbundeneStadt = eit.next(); //Stuttgart Mannheim
val = g.getEdgeValue(stadtname, verbundeneStadt);
naechsterWert= wegZuDieserStadt + val;
//in der PQ sind alle staedte drinne, also wird hier nur der wert bearbeitet
//bearbeiten = loeschen und neu einfuegen (die PQ wird dann automatisch neu sortiert)
//Update der Distanz nur, wenn ein besserer Weg gefunden wurde
if(naechsterWert < myHeap.getDistance(verbundeneStadt)) {//kuerzerer Weg gefunden?
myHeap.deleteNode(verbundeneStadt);
myHeap.add(verbundeneStadt, naechsterWert);
l.add(stadtname);
l.add(verbundeneStadt);
}
// System.out.println("verbundene Stadt=>"+verbundeneStadt+" mit Wert "+naechsterWert);
if(verbundeneStadt.equals(ziel)) {
String[] arr = new String[l.size()];
int myI = l.size();
for(Iterator<String> myit=l.iterator(); myit.hasNext(); ) {
arr[--myI] = myit.next(); //from
arr[--myI] = myit.next(); //to
}
l = rekAusgabe(arr, 0, ziel, start, g, new LinkedList<String>());
System.out.println("Kuerzester Weg von "+start+" nach "+ziel+" in "+myHeap.getDistance(ziel));
return l;
}
}
}
return null; //Keine Route
}
/**
* Rekursive Ausgabe der besuchten Punkte in eine Liste
* @param arr - Ausgangsarray mit den besuchten Punkten
* @param i -Monentaner Standpunkt
* @param ziel -Zielknoten
* @param start -Startknoten
* @param g -Graphen
* @param l -Liste in die gespeichert wird
* @return
*/
private static List<String> rekAusgabe(String[] arr, int i,String ziel, String start, Graph g, List<String> l) {
if(i<arr.length && arr[i].equals(start)) {
return l;
}
for(i=0; i<arr.length; i+=2) {
if(arr[i].equals(ziel)) {
int val = g.getEdgeValue(arr[i],arr[i+1]);
l.add(0, arr[i+1]+" -> "+ziel+"("+val+")");
return rekAusgabe(arr, i+1, arr[i+1], start, g,l);
}
}
return null;
}
}
|