結果
問題 | No.957 植林 |
ユーザー |
|
提出日時 | 2021-11-20 00:59:22 |
言語 | Rust (1.83.0 + proconio) |
結果 |
WA
|
実行時間 | - |
コード長 | 5,261 bytes |
コンパイル時間 | 13,827 ms |
コンパイル使用メモリ | 400,736 KB |
実行使用メモリ | 48,040 KB |
最終ジャッジ日時 | 2025-01-02 03:28:18 |
合計ジャッジ時間 | 86,496 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 WA * 1 RE * 1 |
other | AC * 4 WA * 6 RE * 12 TLE * 23 |
ソースコード
#[allow(unused_imports)]use std::cmp::*;#[allow(unused_imports)]use std::collections::*;// https://qiita.com/tanakh/items/0ba42c7ca36cd29d0ac8macro_rules! input {($($r:tt)*) => {let stdin = std::io::stdin();let mut bytes = std::io::Read::bytes(std::io::BufReader::new(stdin.lock()));let mut next = move || -> String{bytes.by_ref().map(|r|r.unwrap() as char).skip_while(|c|c.is_whitespace()).take_while(|c|!c.is_whitespace()).collect()};input_inner!{next, $($r)*}};}macro_rules! input_inner {($next:expr) => {};($next:expr,) => {};($next:expr, $var:ident : $t:tt $($r:tt)*) => {let $var = read_value!($next, $t);input_inner!{$next $($r)*}};}macro_rules! read_value {($next:expr, ( $($t:tt),* )) => { ($(read_value!($next, $t)),*) };($next:expr, [ $t:tt ; $len:expr ]) => {(0..$len).map(|_| read_value!($next, $t)).collect::<Vec<_>>()};($next:expr, $t:ty) => ($next().parse::<$t>().expect("Parse error"));}/*** Dinic's algorithm for maximum flow problem.* Verified by: yukicoder No.177 (http://yukicoder.me/submissions/148371)* Min-cut (the second element of max_flow's returned values) is not verified.*/#[derive(Clone)]struct Edge<T> {to: usize,cap: T,rev: usize, // rev is the position of the reverse edge in graph[to]}struct Dinic<T> {graph: Vec<Vec<Edge<T>>>,iter: Vec<usize>,zero: T,}impl<T> Dinic<T>where T: Clone,T: Copy,T: Ord,T: std::ops::AddAssign,T: std::ops::SubAssign,{fn bfs(&self, s: usize, level: &mut [Option<usize>]) {let n = level.len();for i in 0 .. n {level[i] = None;}let mut que = std::collections::VecDeque::new();level[s] = Some(0);que.push_back(s);while let Some(v) = que.pop_front() {for e in self.graph[v].iter() {if e.cap > self.zero && level[e.to] == None {level[e.to] = Some(level[v].unwrap() + 1);que.push_back(e.to);}}}}/* search augment path by dfs.* if f == None, f is treated as infinity.*/fn dfs(&mut self, v: usize, t: usize, f: Option<T>, level: &mut [Option<usize>]) -> T {if v == t {return f.unwrap();}while self.iter[v] < self.graph[v].len() {let i = self.iter[v];let e = self.graph[v][i].clone();if e.cap > self.zero && level[v] < level[e.to] {let newf = std::cmp::min(f.unwrap_or(e.cap), e.cap);let d = self.dfs(e.to, t, Some(newf), level);if d > self.zero {self.graph[v][i].cap -= d;self.graph[e.to][e.rev].cap += d;return d;}}self.iter[v] += 1;}self.zero}pub fn new(n: usize, zero: T) -> Self {Dinic {graph: vec![Vec::new(); n],iter: vec![0; n],zero: zero,}}pub fn add_edge(&mut self, from: usize, to: usize, cap: T) {let added_from = Edge { to: to, cap: cap,rev: self.graph[to].len() };let added_to = Edge { to: from, cap: self.zero,rev: self.graph[from].len() };self.graph[from].push(added_from);self.graph[to].push(added_to);}pub fn max_flow(&mut self, s: usize, t: usize) -> (T, Vec<usize>) {let mut flow = self.zero;let n = self.graph.len();let mut level = vec![None; n];loop {self.bfs(s, &mut level);if level[t] == None {let ret = (0 .. n).filter(|&i| level[i] == None).collect();return (flow, ret);}self.iter.clear();self.iter.resize(n, 0);loop {let f = self.dfs(s, t, None, &mut level);if f <= self.zero { break; }flow += f;}}}}fn main() {// In order to avoid potential stack overflow, spawn a new thread.let stack_size = 104_857_600; // 100 MBlet thd = std::thread::Builder::new().stack_size(stack_size);thd.spawn(|| solve()).unwrap().join().unwrap();}fn solve() {input! {h: usize, w: usize,g: [[i64; w]; h],r: [i64; h],c: [i64; w],}let big = 1 << 30;let inf = 1 << 50;let mut din = Dinic::new(2 + h + w + h * w, 0i64);for i in 0..h {din.add_edge(0, 2 + i, big);din.add_edge(2 + i, 1, big - r[i]);for j in 0..w {din.add_edge(2 + i, 2 + h + w + i * w + j, inf);din.add_edge(2 + h + j, 2 + h + w + i * w + j, inf);din.add_edge(2 + h + w + i * w + j, 1, g[i][j]);}}for j in 0..h {din.add_edge(0, 2 + h + j, big);din.add_edge(2 + h + j, 1, big - c[j]);}let (ma, _) = din.max_flow(0, 1);println!("{}", ma - big * (h + w) as i64);}