Skip to content

Commit 1ff54bd

Browse files
Add maxflow
1 parent ae02989 commit 1ff54bd

File tree

1 file changed

+250
-0
lines changed

1 file changed

+250
-0
lines changed

src/maxflow.rs

Lines changed: 250 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,251 @@
1+
use crate::internal_queue::SimpleQueue;
2+
use std::cmp::min;
3+
use std::iter;
4+
use std::ops::{Add, AddAssign, Sub, SubAssign};
15

6+
// Maybe it should be in a separate module
7+
pub trait MfCapacity:
8+
Copy + Ord + Add<Output = Self> + AddAssign + Sub<Output = Self> + SubAssign
9+
{
10+
fn zero() -> Self;
11+
fn max_value() -> Self;
12+
}
13+
14+
impl MfCapacity for i32 {
15+
fn zero() -> Self {
16+
0
17+
}
18+
fn max_value() -> Self {
19+
std::i32::MAX
20+
}
21+
}
22+
23+
impl MfCapacity for i64 {
24+
fn zero() -> Self {
25+
0
26+
}
27+
fn max_value() -> Self {
28+
std::i64::MAX
29+
}
30+
}
31+
32+
impl MfCapacity for u32 {
33+
fn zero() -> Self {
34+
0
35+
}
36+
fn max_value() -> Self {
37+
std::u32::MAX
38+
}
39+
}
40+
41+
impl MfCapacity for u64 {
42+
fn zero() -> Self {
43+
0
44+
}
45+
fn max_value() -> Self {
46+
std::u64::MAX
47+
}
48+
}
49+
50+
impl<Cap> MfGraph<Cap>
51+
where
52+
Cap: MfCapacity,
53+
{
54+
pub fn new(n: usize) -> MfGraph<Cap> {
55+
MfGraph {
56+
_n: n,
57+
pos: Vec::new(),
58+
g: iter::repeat_with(Vec::new).take(n).collect(),
59+
}
60+
}
61+
62+
pub fn add_edge(&mut self, from: usize, to: usize, cap: Cap) -> usize {
63+
assert!(from < self._n);
64+
assert!(to < self._n);
65+
assert!(Cap::zero() < cap);
66+
let m = self.pos.len();
67+
self.pos.push((from, self.g[from].len()));
68+
let rev = self.g[to].len();
69+
self.g[from].push(_Edge { to, rev, cap });
70+
let rev = self.g[from].len() - 1;
71+
self.g[to].push(_Edge {
72+
to: from,
73+
rev,
74+
cap: Cap::zero(),
75+
});
76+
m
77+
}
78+
}
79+
80+
struct Edge<Cap> {
81+
from: usize,
82+
to: usize,
83+
cap: Cap,
84+
flow: Cap,
85+
}
86+
87+
impl<Cap> MfGraph<Cap>
88+
where
89+
Cap: MfCapacity,
90+
{
91+
fn get_edge(&self, i: usize) -> Edge<Cap> {
92+
let m = self.pos.len();
93+
assert!(i < m);
94+
let _e = &self.g[self.pos[i].0][self.pos[i].1];
95+
let _re = &self.g[_e.to][_e.rev];
96+
Edge {
97+
from: self.pos[i].0,
98+
to: _e.to,
99+
cap: _e.cap + _re.cap,
100+
flow: _re.cap,
101+
}
102+
}
103+
fn edges(&self) -> Vec<Edge<Cap>> {
104+
let m = self.pos.len();
105+
(0..m).map(|i| self.get_edge(i)).collect()
106+
}
107+
fn change_edge(&mut self, i: usize, new_cap: Cap, new_flow: Cap) {
108+
let m = self.pos.len();
109+
assert!(i < m);
110+
assert!(Cap::zero() < new_flow && new_flow <= new_cap);
111+
let (to, rev) = {
112+
let _e = &mut self.g[self.pos[i].0][self.pos[i].1];
113+
_e.cap = new_cap - new_flow;
114+
(_e.to, _e.rev)
115+
};
116+
let _re = &mut self.g[to][rev];
117+
_re.cap = new_flow;
118+
}
119+
120+
pub fn flow(&mut self, s: usize, t: usize) -> Cap {
121+
self.flow_with_capacity(s, t, Cap::max_value())
122+
}
123+
pub fn flow_with_capacity(&mut self, s: usize, t: usize, flow_limit: Cap) -> Cap {
124+
let n_ = self._n;
125+
assert!(s < n_);
126+
assert!(t < n_);
127+
128+
let mut calc = FlowCalculator {
129+
graph: self,
130+
s,
131+
t,
132+
flow_limit,
133+
level: vec![0; n_],
134+
iter: vec![0; n_],
135+
que: SimpleQueue::default(),
136+
};
137+
138+
let mut flow = Cap::zero();
139+
while flow < flow_limit {
140+
calc.bfs();
141+
if calc.level[t] == -1 {
142+
break;
143+
}
144+
calc.iter.iter_mut().for_each(|e| *e = 0);
145+
while flow < flow_limit {
146+
let f = calc.dfs(t, flow_limit - flow);
147+
if f == Cap::zero() {
148+
break;
149+
}
150+
flow += f;
151+
}
152+
}
153+
flow
154+
}
155+
156+
pub fn min_cut(&self, s: usize) -> Vec<bool> {
157+
let mut visited = vec![false; self._n];
158+
let mut que = SimpleQueue::default();
159+
que.push(s);
160+
while !que.empty() {
161+
let &p = que.front();
162+
que.pop();
163+
visited[p] = true;
164+
for e in &self.g[p] {
165+
if e.cap != Cap::zero() && !visited[e.to] {
166+
visited[e.to] = true;
167+
que.push(e.to);
168+
}
169+
}
170+
}
171+
visited
172+
}
173+
}
174+
175+
struct FlowCalculator<'a, Cap> {
176+
graph: &'a mut MfGraph<Cap>,
177+
s: usize,
178+
t: usize,
179+
flow_limit: Cap,
180+
level: Vec<i32>,
181+
iter: Vec<usize>,
182+
que: SimpleQueue<usize>,
183+
}
184+
185+
impl<Cap> FlowCalculator<'_, Cap>
186+
where
187+
Cap: MfCapacity,
188+
{
189+
fn bfs(&mut self) {
190+
self.level.iter_mut().for_each(|e| *e = -1);
191+
self.level[self.s] = 0;
192+
self.que.clear();
193+
self.que.push(self.s);
194+
while !self.que.empty() {
195+
let v = *self.que.front();
196+
self.que.pop();
197+
for e in &self.graph.g[v] {
198+
if e.cap == Cap::zero() || self.level[e.to] >= 0 {
199+
continue;
200+
}
201+
self.level[e.to] = self.level[v] + 1;
202+
if e.to == self.t {
203+
return;
204+
}
205+
self.que.push(e.to);
206+
}
207+
}
208+
}
209+
fn dfs(&mut self, v: usize, up: Cap) -> Cap {
210+
if v == self.s {
211+
return up;
212+
}
213+
let mut res = Cap::zero();
214+
let level_v = self.level[v];
215+
for i in self.iter[v]..self.graph.g[v].len() {
216+
self.iter[v] = i;
217+
let &_Edge {
218+
to: e_to,
219+
rev: e_rev,
220+
..
221+
} = &self.graph.g[v][i];
222+
if level_v <= self.level[e_to] || self.graph.g[e_to][e_rev].cap == Cap::zero() {
223+
continue;
224+
}
225+
let d = self.dfs(e_to, min(up - res, self.graph.g[e_to][e_rev].cap));
226+
if d <= Cap::zero() {
227+
continue;
228+
}
229+
self.graph.g[v][i].cap += d;
230+
self.graph.g[e_to][e_rev].cap -= d;
231+
res += d;
232+
if res == up {
233+
break;
234+
}
235+
}
236+
return res;
237+
}
238+
}
239+
240+
#[derive(Default)]
241+
pub struct MfGraph<Cap> {
242+
_n: usize,
243+
pos: Vec<(usize, usize)>,
244+
g: Vec<Vec<_Edge<Cap>>>,
245+
}
246+
247+
struct _Edge<Cap> {
248+
to: usize,
249+
rev: usize,
250+
cap: Cap,
251+
}

0 commit comments

Comments
 (0)