competitive/graph/
maximum_flow.rs1use super::BidirectionalSparseGraph;
2use std::collections::VecDeque;
3
4#[derive(Debug, Clone)]
5pub struct DinicBuilder {
6 vsize: usize,
7 edges: Vec<(usize, usize)>,
8 capacities: Vec<u64>,
9}
10impl DinicBuilder {
11 pub fn new(vsize: usize, esize_expect: usize) -> Self {
12 Self {
13 vsize,
14 edges: Vec::with_capacity(esize_expect),
15 capacities: Vec::with_capacity(esize_expect * 2),
16 }
17 }
18 pub fn add_edge(&mut self, from: usize, to: usize, cap: u64) {
19 self.edges.push((from, to));
20 self.capacities.push(cap);
21 self.capacities.push(0);
22 }
23 pub fn gen_graph(&mut self) -> BidirectionalSparseGraph {
24 let edges = std::mem::take(&mut self.edges);
25 BidirectionalSparseGraph::from_edges(self.vsize, edges)
26 }
27 pub fn build(self, graph: &BidirectionalSparseGraph) -> Dinic<'_> {
28 let DinicBuilder {
29 vsize, capacities, ..
30 } = self;
31 Dinic {
32 graph,
33 capacities,
34 iter: Vec::with_capacity(vsize),
35 level: Vec::with_capacity(vsize),
36 deq: VecDeque::with_capacity(vsize),
37 }
38 }
39}
40impl Extend<(usize, usize, u64)> for DinicBuilder {
41 fn extend<T: IntoIterator<Item = (usize, usize, u64)>>(&mut self, iter: T) {
42 for (from, to, cap) in iter {
43 self.add_edge(from, to, cap)
44 }
45 }
46}
47
48#[derive(Debug, Clone)]
49pub struct Dinic<'a> {
50 graph: &'a BidirectionalSparseGraph,
51 capacities: Vec<u64>,
52 iter: Vec<usize>,
53 level: Vec<usize>,
54 deq: VecDeque<usize>,
55}
56impl Dinic<'_> {
57 pub fn builder(vsize: usize, esize_expect: usize) -> DinicBuilder {
58 DinicBuilder::new(vsize, esize_expect)
59 }
60 fn bfs(&mut self, s: usize, t: usize) -> bool {
61 self.level.clear();
62 self.level.resize(self.graph.vertices_size(), usize::MAX);
63 self.level[s] = 0;
64 self.deq.clear();
65 self.deq.push_back(s);
66 while let Some(u) = self.deq.pop_front() {
67 for a in self.graph.adjacencies(u) {
68 if self.capacities[a.id] > 0 && self.level[a.to] == usize::MAX {
69 self.level[a.to] = self.level[u] + 1;
70 if a.to == t {
71 return false;
72 }
73 self.deq.push_back(a.to);
74 }
75 }
76 }
77 self.level[t] == usize::MAX
78 }
79 fn dfs(&mut self, s: usize, u: usize, upper: u64) -> u64 {
80 if u == s {
81 return upper;
82 }
83 let mut res = 0;
84 for a in self.graph.adjacencies(u).skip(self.iter[u]) {
85 if self.level[u] > self.level[a.to] && self.capacities[a.id ^ 1] > 0 {
86 let d = self.dfs(s, a.to, (upper - res).min(self.capacities[a.id ^ 1]));
87 if d > 0 {
88 self.capacities[a.id ^ 1] -= d;
89 self.capacities[a.id] += d;
90 res += d;
91 if upper == res {
92 break;
93 }
94 }
95 }
96 self.iter[u] += 1;
97 }
98 res
99 }
100 pub fn maximum_flow_limited(&mut self, s: usize, t: usize, limit: u64) -> u64 {
101 let mut flow = 0;
102 while flow < limit {
103 if self.bfs(s, t) {
104 break;
105 }
106 self.iter.clear();
107 self.iter.resize(self.graph.vertices_size(), 0);
108 while flow < limit {
109 let f = self.dfs(s, t, limit - flow);
110 if f == 0 {
111 break;
112 }
113 flow += f;
114 }
115 }
116 flow
117 }
118 pub fn maximum_flow(&mut self, s: usize, t: usize) -> u64 {
119 self.maximum_flow_limited(s, t, u64::MAX)
120 }
121 pub fn minimum_cut(&mut self, s: usize) -> Vec<bool> {
122 let mut visited = vec![false; self.graph.vertices_size()];
123 visited[s] = true;
124 self.deq.clear();
125 self.deq.push_back(s);
126 while let Some(u) = self.deq.pop_front() {
127 for a in self.graph.adjacencies(u) {
128 if self.capacities[a.id] > 0 && !visited[a.to] {
129 visited[a.to] = true;
130 self.deq.push_back(a.to);
131 }
132 }
133 }
134 visited
135 }
136 pub fn get_flow(&self, eid: usize) -> u64 {
137 self.capacities[eid * 2 + 1]
138 }
139 pub fn change_edge(&mut self, eid: usize, cap: u64, flow: u64) {
140 assert!(flow <= cap);
141 self.capacities[eid * 2] = cap - flow;
142 self.capacities[eid * 2 + 1] = flow;
143 }
144}