2023-08-14 夏休み / 最大流問題 (オリジナル問題) を解いた
夏休み。子どもを見ている。
- 最大流問題 (オリジナル問題)
https://atcoder.jp/contests/pastbook2022/tasks/pastbook2022_e
- https://atcoder.jp/contests/pastbook2022/submissions/44573974
- 解説 AC
- 素朴な最大流の問題
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);
}
今日のコミット。
- tsukota 9 commits
- tsukota: Add the activity indicator when restoring an account
- tsukota: Improve restore account performance
- tsukota: npm i @bouzuya/tsukota-models@0.3.0
- models: 0.3.0
- models: Exports unsafeApplyEvent
- models: Fix prettier VS Code extension settings
- models: Remove transactionsByYearMonth
- models: 0.2.0
- models: Add transactionsByYearMonth to account
- rust-atcoder 1 commit