| Task: | Download Speed |
| Sender: | kookinnam |
| Submission time: | 2025-10-19 01:27:58 +0300 |
| Language: | Python3 (PyPy3) |
| Status: | READY |
| Result: | ACCEPTED |
| test | verdict | time | |
|---|---|---|---|
| #1 | ACCEPTED | 0.05 s | details |
| #2 | ACCEPTED | 0.05 s | details |
| #3 | ACCEPTED | 0.05 s | details |
| #4 | ACCEPTED | 0.05 s | details |
| #5 | ACCEPTED | 0.08 s | details |
| #6 | ACCEPTED | 0.10 s | details |
| #7 | ACCEPTED | 0.12 s | details |
| #8 | ACCEPTED | 0.05 s | details |
| #9 | ACCEPTED | 0.05 s | details |
| #10 | ACCEPTED | 0.05 s | details |
| #11 | ACCEPTED | 0.09 s | details |
| #12 | ACCEPTED | 0.05 s | details |
Code
from collections import deque
class Dinic:
def __init__(self, n):
self.n = n
self.adj = [[] for _ in range(n)]
def add_edge(self, u, v, cap):
self.adj[u].append([v, cap, len(self.adj[v])])
self.adj[v].append([u, 0, len(self.adj[u]) - 1]) # reverse edge
def bfs(self, s, t, level):
for i in range(len(level)):
level[i] = -1
level[s] = 0
queue = deque([s])
while queue:
u = queue.popleft()
for i, (v, cap, _) in enumerate(self.adj[u]):
if cap > 0 and level[v] < 0:
level[v] = level[u] + 1
queue.append(v)
return level[t] >= 0
def send_flow(self, u, t, flow, level, start):
if u == t:
return flow
while start[u] < len(self.adj[u]):
v, cap, rev = self.adj[u][start[u]]
if cap > 0 and level[v] == level[u] + 1:
curr_flow = min(flow, cap)
temp_flow = self.send_flow(v, t, curr_flow, level, start)
if temp_flow > 0:
self.adj[u][start[u]][1] -= temp_flow
self.adj[v][rev][1] += temp_flow
return temp_flow
start[u] += 1
return 0
def max_flow(self, s, t):
if s == t:
return -1
total = 0
level = [-1] * self.n
while self.bfs(s, t, level):
start = [0] * self.n
flow = self.send_flow(s, t, 10**15, level, start)
while flow > 0:
total += flow
flow = self.send_flow(s, t, 10**15, level, start)
return total
# Input reading
n, m = map(int, input().split())
dinic = Dinic(n)
for _ in range(m):
a, b, c = map(int, input().split())
# Convert to zero-based indexing
dinic.add_edge(a - 1, b - 1, c)
# Compute max flow from 0 to n-1
print(dinic.max_flow(0, n - 1))
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 |
