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 solmua, jotka on numeroitu .
- 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 solmuun on , mutta Dijkstran algoritmi antaa vastauksen .
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 solmuun ja sen paino on . Toinen kaari kulkee solmusta solmuun ja sen paino on .
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