Skip to content

Commit 55c0d81

Browse files
Added sample code for D - Maxflow
1 parent 693cfdb commit 55c0d81

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

examples/practice2_d_maxflow.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
use ac_library_rs::MfGraph;
2+
use std::io::Read;
3+
use std::iter;
4+
5+
fn main() {
6+
const N: usize = 128;
7+
8+
let mut buf = String::new();
9+
std::io::stdin().read_to_string(&mut buf).unwrap();
10+
let mut input = buf.split_whitespace();
11+
12+
let n: usize = input.next().unwrap().parse().unwrap();
13+
let m: usize = input.next().unwrap().parse().unwrap();
14+
let mut s = vec![vec![false; N]; N];
15+
for i in 1..=n {
16+
for (j, c) in (1..=m).zip(input.next().unwrap().chars()) {
17+
s[i][j] = c == '.';
18+
}
19+
}
20+
21+
let dy = [1, 0, -1, 0];
22+
let dx = [0, 1, 0, -1];
23+
let c = "v>^<".chars().collect::<Vec<_>>();
24+
let mut graph = MfGraph::<i32>::new(128 * 128);
25+
26+
for i in 1..=n {
27+
for j in 1..=m {
28+
if (i + j) % 2 == 0 {
29+
graph.add_edge(0, i * N + j, 1);
30+
for (dy, dx) in dy.iter().zip(dx.iter()) {
31+
let k = (i as i32 + dy) as usize;
32+
let l = (j as i32 + dx) as usize;
33+
if s[i][j] && s[k][l] {
34+
graph.add_edge(i * N + j, k * N + l, 1);
35+
}
36+
}
37+
} else {
38+
graph.add_edge(i * N + j, 1, 1);
39+
}
40+
}
41+
}
42+
println!("{}", graph.flow(0, 1));
43+
let mut res: Vec<Vec<_>> = (1..=n)
44+
.map(|i| (1..=m).map(|j| if s[i][j] { '.' } else { '#' }).collect())
45+
.collect();
46+
for e in graph.edges() {
47+
let i = e.from / N;
48+
let j = e.from % N;
49+
let k = e.to / N;
50+
let l = e.to % N;
51+
if e.flow == 1 {
52+
for h in 0..4 {
53+
if i as i32 + dy[h] == k as i32 && j as i32 + dx[h] == l as i32 {
54+
res[i - 1][j - 1] = c[h];
55+
res[k - 1][l - 1] = c[h ^ 2];
56+
}
57+
}
58+
}
59+
}
60+
for s in res {
61+
println!("{}", s.iter().collect::<String>());
62+
}
63+
}

0 commit comments

Comments
 (0)