CSES - Väärä polku

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 nn solmua, jotka on numeroitu 1,2,,n1,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 11 solmuun nn on aa, mutta Dijkstran algoritmi antaa vastauksen bb.

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 11 solmuun 22 ja sen paino on 55. Toinen kaari kulkee solmusta 11 solmuun 33 ja sen paino on 11.

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