Submission details
Task:Download Speed
Sender:aalto26gh_013
Submission time:2026-10-22 11:29:04 +0300
Language:Python3 (PyPy3)
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.04 sdetails
#2ACCEPTED0.04 sdetails
#3ACCEPTED0.04 sdetails
#4ACCEPTED0.04 sdetails
#5ACCEPTED0.05 sdetails
#6ACCEPTED0.06 sdetails
#7ACCEPTED0.06 sdetails
#8ACCEPTED0.04 sdetails
#9ACCEPTED0.04 sdetails
#10ACCEPTED0.04 sdetails
#11ACCEPTED0.05 sdetails
#12ACCEPTED0.04 sdetails

Code

import sys
from collections import deque

input = sys.stdin.readline
INF = float("inf")

def I():  return int(input())
def MI(): return map(int, input().split())
def LI(): return list(map(int, input().split()))
def S():  return input().strip()

def flow_net(N):  # cap[a][b] = remaining capacity, nb = neighbours in BOTH directions
    return [[0] * N for _ in range(N)], [set() for _ in range(N)]

def add_edge(cap, nb, a, b, c):
    cap[a][b] += c                        # += : the same connection can be listed twice
    nb[a].add(b)
    nb[b].add(a)                          # b -> a must be searchable: it's the "undo" edge

def augment(cap, nb, s, t):  # BFS one s-t path with capacity left, push its bottleneck -> amount (0 = none)
    par = [-1] * len(cap)
    par[s] = s
    q = deque([s])
    while q and par[t] == -1:
        u = q.popleft()
        cu = cap[u]
        for v in nb[u]:
            if par[v] == -1 and cu[v] > 0:
                par[v] = u
                q.append(v)
    if par[t] == -1:
        return 0
    d, v = INF, t
    while v != s:                         # bottleneck = smallest cap on the path
        d = min(d, cap[par[v]][v])
        v = par[v]
    v = t
    while v != s:
        u = par[v]
        cap[u][v] -= d                    # use it up
        cap[v][u] += d                    # and allow undoing it later
        v = u
    return d

def maxflow(cap, nb, s, t):  # Edmonds-Karp, O(n m^2)
    flow = 0
    while True:
        d = augment(cap, nb, s, t)
        if d == 0:
            return flow
        flow += d

n, m = MI()
cap, nb = flow_net(n + 1)
for _ in range(m):
    a, b, c = MI()
    add_edge(cap, nb, a, b, c)

print(maxflow(cap, nb, 1, n))

Test details

Test 1

Verdict: ACCEPTED

input
4 3
1 2 5
2 3 3
3 4 6

correct output
3

user output
3

Test 2

Verdict: ACCEPTED

input
4 5
1 2 1
1 3 1
2 3 1
2 4 1
...

correct output
2

user output
2

Test 3

Verdict: ACCEPTED

input
4 5
1 2 1000000000
1 3 1000000000
2 3 1
2 4 1000000000
...

correct output
2000000000

user output
2000000000

Test 4

Verdict: ACCEPTED

input
2 1
2 1 100

correct output
0

user output
0

Test 5

Verdict: ACCEPTED

input
2 1000
1 2 1000000000
1 2 1000000000
1 2 1000000000
1 2 1000000000
...

correct output
1000000000000

user output
1000000000000

Test 6

Verdict: ACCEPTED

input
500 998
1 2 54
1 3 59
1 4 83
2 5 79
...

correct output
60

user output
60

Test 7

Verdict: ACCEPTED

input
500 998
1 2 530873053
1 3 156306296
1 4 478040476
3 5 303609600
...

correct output
1093765123

user output
1093765123

Test 8

Verdict: ACCEPTED

input
2 1
1 2 1

correct output
1

user output
1

Test 9

Verdict: ACCEPTED

input
4 5
1 2 3
2 4 2
1 3 4
3 4 5
...

correct output
6

user output
6

Test 10

Verdict: ACCEPTED

input
4 5
1 2 1
1 3 2
3 2 1
2 4 2
...

correct output
3

user output
3

Test 11

Verdict: ACCEPTED

input
10 999
1 2 1000000000
1 2 1000000000
1 2 1000000000
1 2 1000000000
...

correct output
111000000000

user output
111000000000

Test 12

Verdict: ACCEPTED

input
7 9
1 2 1
1 3 1
1 4 1
2 5 1
...

correct output
2

user output
2