Submission #44573974
Source Code Expand
use std::collections::VecDeque;
use proconio::{input, marker::Usize1};
fn bfs(edges: &[Vec<(usize, usize, usize)>], s: usize) -> Vec<Option<usize>> {
let mut dist = vec![None; edges.len()];
dist[s] = Some(0_usize);
let mut deque = VecDeque::new();
deque.push_back(s);
while let Some(u) = deque.pop_front() {
let dist_u = dist[u].unwrap();
for (v, _, _) in edges[u].iter().copied().filter(|&(_, c, _)| c > 0) {
if dist[v].is_none() {
dist[v] = Some(dist_u + 1);
deque.push_back(v);
}
}
}
dist
}
fn dfs(
edges: &mut [Vec<(usize, usize, usize)>],
u: usize,
t: usize,
f: usize,
removed: &mut [usize],
dist: &[Option<usize>],
) -> Option<usize> {
if u == t {
return Some(f);
}
while removed[u] < edges[u].len() {
let (v, c, rev) = edges[u][removed[u]];
if c > 0 && dist[u].unwrap() < dist[v].unwrap() {
if let Some(flow) = dfs(edges, v, t, f.min(c), removed, dist) {
edges[u][removed[u]].1 -= flow;
edges[v][rev].1 += flow;
return Some(flow);
}
}
removed[u] += 1;
}
None
}
fn calc_max_flow(edges: &mut [Vec<(usize, usize, usize)>], s: usize, t: usize) -> usize {
let mut flow = 0_usize;
loop {
let dist = bfs(&edges, s);
if dist[t].is_none() {
break;
}
let mut removed = vec![0; edges.len()];
while let Some(f) = dfs(edges, s, t, std::usize::MAX, &mut removed, &dist) {
flow += f;
}
}
flow
}
fn main() {
input! {
v: usize,
e: usize,
uvc: [(Usize1, Usize1, usize); e],
}
// Dinic 法
let mut edges = vec![vec![]; v];
for (u, v, c) in uvc {
let index_u = edges[u].len();
let index_v = edges[v].len();
edges[u].push((v, c, index_v));
edges[v].push((u, 0, index_u));
}
let max_flow = calc_max_flow(&mut edges, 0, v - 1);
println!("{}", max_flow);
}
Submission Info
Submission Time |
|
Task |
E - 最大流 |
User |
bouzuya |
Language |
Rust (1.42.0) |
Score |
100 |
Code Size |
2087 Byte |
Status |
AC |
Exec Time |
7 ms |
Memory |
2160 KiB |
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
100 / 100 |
Status |
|
|
Set Name |
Test Cases |
Sample |
00_sample_00 |
All |
00_sample_00, 99_challenge_00, random_0, random_1, random_10, random_11, random_12, random_13, random_14, random_15, random_16, random_17, random_18, random_19, random_2, random_3, random_4, random_5, random_6, random_7, random_8, random_9 |
Case Name |
Status |
Exec Time |
Memory |
00_sample_00 |
AC |
7 ms |
2064 KiB |
99_challenge_00 |
AC |
1 ms |
1992 KiB |
random_0 |
AC |
1 ms |
2028 KiB |
random_1 |
AC |
1 ms |
1948 KiB |
random_10 |
AC |
1 ms |
2160 KiB |
random_11 |
AC |
1 ms |
2044 KiB |
random_12 |
AC |
2 ms |
2056 KiB |
random_13 |
AC |
2 ms |
2068 KiB |
random_14 |
AC |
2 ms |
2048 KiB |
random_15 |
AC |
1 ms |
2136 KiB |
random_16 |
AC |
2 ms |
2040 KiB |
random_17 |
AC |
1 ms |
2140 KiB |
random_18 |
AC |
1 ms |
2112 KiB |
random_19 |
AC |
2 ms |
2064 KiB |
random_2 |
AC |
2 ms |
2148 KiB |
random_3 |
AC |
1 ms |
1944 KiB |
random_4 |
AC |
1 ms |
1972 KiB |
random_5 |
AC |
1 ms |
2044 KiB |
random_6 |
AC |
1 ms |
2048 KiB |
random_7 |
AC |
1 ms |
1956 KiB |
random_8 |
AC |
1 ms |
2044 KiB |
random_9 |
AC |
2 ms |
2068 KiB |