Dijkstran algoritmi ei anna välttämättä oikeaa vastausta, jos verkossa on negatiivisen painoisia kaaria.
Tehtäväsi on rakentaa verkko, jossa kurssimateriaalin Dijkstran algoritmin toteutus antaa väärän vastauksen. Verkolla tulee olla seuraavat ominaisuudet:
- Verkossa on n solmua, jotka on numeroitu 1,2,\dots,n.
- Saat päättää itse verkon kaarten määrän.
- Jokainen kaari on suunnattu ja kaaren paino on kokonaisluku.
- Verkossa ei ole kahta kaarta samasta lähtösolmusta samaan kohdesolmuun.
- Verkossa ei ole kaarta, jonka lähtösolmu ja kohdesolmu ovat samat.
- Lyhimmän polun pituus solmusta 1 solmuun n on a, mutta Dijkstran algoritmi antaa vastauksen b.
Toteuta tiedostoon pathfail.py funktio create_edges, joka muodostaa halutunlaisen verkon. Funktion tulee palauttaa listana verkon kaaret.
Esimerkiksi lista [(1, 2, 5), (1, 3, 1)] tarkoittaisi, että verkossa on kaksi kaarta. Ensimmäinen kaari kulkee solmusta 1 solmuun 2 ja sen paino on 5. Toinen kaari kulkee solmusta 1 solmuun 3 ja sen paino on 1.
Voit muodostaa minkä tahansa verkon, jolla on halutut ominaisuudet. Voit olettaa, että funktiota testataan vain parametreilla, joilla verkko voidaan muodostaa.
class BellmanFord:
# voit kopioida tämän luokan kurssimateriaalista
class Dijkstra:
# voit kopioida tämän luokan kurssimateriaalista
def create_edges(n, a, b):
# TODO
def find_answer(my_class, n, edges):
nodes = range(1, n + 1)
finder = my_class(nodes)
for edge in edges:
finder.add_edge(edge[0], edge[1], edge[2])
distances = finder.find_distances(1)
return distances[n]
if __name__ == "__main__":
n = 100
edges = create_edges(n, 42, 1337)
answer1 = find_answer(BellmanFord, n, edges)
print(answer1) # 42
answer2 = find_answer(Dijkstra, n, edges)
print(answer2) # 1337
