113 lines
2.6 KiB
Python
Executable File
113 lines
2.6 KiB
Python
Executable File
|
|
connections = [('Würzburg', 'Schweinfurt', 50),
|
|
('Würzburg', 'Nürnberg', 100),
|
|
('Schweinfurt', 'Bamberg', 60),
|
|
('Bamberg', 'Coburg', 50),
|
|
('Bamberg', 'Nürnberg', 60),
|
|
('Bamberg', 'Bayreuth', 60),
|
|
('Nürnberg', 'Bayreuth', 90),
|
|
('Bayreuth', 'Hof', 50),
|
|
('Coburg', 'Hof', 80),
|
|
]
|
|
|
|
def allNodes(connections):
|
|
nodes = set()
|
|
|
|
for a in connections:
|
|
nodes.add(a[0])
|
|
nodes.add(a[1])
|
|
|
|
return nodes
|
|
|
|
def initMap(connections):
|
|
|
|
m = allNodes(connections)
|
|
knoten = {}
|
|
|
|
for a in m:
|
|
knoten[a] = {}
|
|
|
|
return knoten
|
|
|
|
def addConnection(data, connection):
|
|
a, b, c = connection
|
|
|
|
data[a].setdefault('connection', []).append([b, c])
|
|
data[b].setdefault('connection', []).append([a, c])
|
|
|
|
return data
|
|
|
|
def resetMap(map):
|
|
for node in map:
|
|
map[node]["distance"] = None
|
|
map[node]["predecessor"] = None
|
|
map[node]["finalized"] = False
|
|
|
|
def setStart(map, start):
|
|
resetMap(map)
|
|
map[start]["distance"] = 0
|
|
map[start]["predecessor"] = start
|
|
map[start]["finalized"] = False
|
|
|
|
return map
|
|
|
|
|
|
def calculateAllDistances(map: dict):
|
|
|
|
|
|
while True:
|
|
knoten = None
|
|
dist = None
|
|
|
|
for stadt in map:
|
|
if map[stadt]["finalized"] == False and map[stadt]["distance"] is not None:
|
|
if dist is None or map[stadt]["distance"] < dist:
|
|
knoten = stadt
|
|
dist = map[stadt]["distance"]
|
|
|
|
if knoten == None:
|
|
break
|
|
|
|
map[knoten]["finalized"] = True
|
|
|
|
for verbindung in map[knoten]["connection"]:
|
|
zielstadt = verbindung[0]
|
|
entfernung = verbindung[1]
|
|
|
|
neue_entfernung = map[knoten]["distance"] + entfernung
|
|
|
|
if map[zielstadt]["distance"] is None or neue_entfernung < map[zielstadt]["distance"]:
|
|
map[zielstadt]["distance"] = neue_entfernung
|
|
map[zielstadt]["predecessor"] = knoten
|
|
|
|
return map
|
|
|
|
|
|
def pathFromTo(map, start, ende):
|
|
path = []
|
|
|
|
aktuelle_stadt = ende
|
|
|
|
while True:
|
|
path.insert(0, aktuelle_stadt)
|
|
|
|
if aktuelle_stadt == start:
|
|
break
|
|
|
|
aktuelle_stadt = map[aktuelle_stadt]["predecessor"]
|
|
|
|
return path
|
|
|
|
|
|
|
|
map = initMap(connections)
|
|
# print(initMap(connections))
|
|
# print(connections[0][0])
|
|
for con in connections:
|
|
addConnection(map, con)
|
|
# print(map)
|
|
setStart(map, "Würzburg")
|
|
calculateAllDistances(map)
|
|
print(calculateAllDistances(map))
|
|
print(pathFromTo(map, "Würzburg", "Hof"))
|