CSES - Täydennyspolut

Tehtäväsi on rakentaa suunnattu verkko, jonka solmut ovat 1,2,,1001,2,\dots,100 ja jossa kurssimateriaalin algoritmi muodostaa tasan xx täydennyspolkua, kun lasketaan maksimivirtaus solmusta 11 solmuun 100100.

Saat päättää itse, montako kaarta verkossa on. Jokaisen kaaren painon tulee olla positiivinen kokonaisluku. Verkossa ei saa olla kahta kaarta, joissa on sama lähtösolmu ja sama kohdesolmu. Lisäksi verkossa ei saa olla kaarta, jonka lähtösolmu ja kohdesolmu on sama.

Toteuta tiedostoon augmenting.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. Funktiota testataan parametreilla 1x1001 \le x \le 100.

# hieman muutettu versio kurssimateriaalin luokasta
class MaximumFlow:
    # ...

    def construct(self, source, sink):
        self.flow = self.graph.copy()
        total = 0
        self.path_count = 0
        while True:
            self.seen = set()
            add = self.add_flow(source, sink, float("inf"))
            if add == 0:
                break
            total += add
            self.path_count += 1
        return total

def create_edges(x):
    # TODO

if __name__ == "__main__":
    edges = create_edges(42)

    maximum_flow = MaximumFlow(range(1, 100 + 1))

    for edge in edges:
        maximum_flow.add_edge(edge[0], edge[1], edge[2])

    maximum_flow.construct(1, 100)
    print(maximum_flow.path_count) # 42