|
34 | 34 | }
|
35 | 35 | }
|
36 | 36 |
|
37 |
| -pub struct Edge<Cap> { |
| 37 | +#[derive(Debug, PartialEq, Eq)] |
| 38 | +pub struct Edge<Cap: Integral> { |
38 | 39 | pub from: usize,
|
39 | 40 | pub to: usize,
|
40 | 41 | pub cap: Cap,
|
@@ -222,3 +223,102 @@ struct _Edge<Cap> {
|
222 | 223 | rev: usize,
|
223 | 224 | cap: Cap,
|
224 | 225 | }
|
| 226 | + |
| 227 | +#[cfg(test)] |
| 228 | +mod test { |
| 229 | + use crate::{Edge, MfGraph}; |
| 230 | + |
| 231 | + #[test] |
| 232 | + fn test_max_flow_wikipedia() { |
| 233 | + // From https://commons.wikimedia.org/wiki/File:Min_cut.png |
| 234 | + // Under CC BY-SA 3.0 https://creativecommons.org/licenses/by-sa/3.0/deed.en |
| 235 | + let mut graph = MfGraph::new(6); |
| 236 | + assert_eq!(graph.add_edge(0, 1, 3), 0); |
| 237 | + assert_eq!(graph.add_edge(0, 2, 3), 1); |
| 238 | + assert_eq!(graph.add_edge(1, 2, 2), 2); |
| 239 | + assert_eq!(graph.add_edge(1, 3, 3), 3); |
| 240 | + assert_eq!(graph.add_edge(2, 4, 2), 4); |
| 241 | + assert_eq!(graph.add_edge(3, 4, 4), 5); |
| 242 | + assert_eq!(graph.add_edge(3, 5, 2), 6); |
| 243 | + assert_eq!(graph.add_edge(4, 5, 3), 7); |
| 244 | + |
| 245 | + assert_eq!(graph.flow(0, 5), 5); |
| 246 | + |
| 247 | + let edges = graph.edges(); |
| 248 | + { |
| 249 | + #[rustfmt::skip] |
| 250 | + assert_eq!( |
| 251 | + edges, |
| 252 | + vec![ |
| 253 | + Edge { from: 0, to: 1, cap: 3, flow: 3 }, |
| 254 | + Edge { from: 0, to: 2, cap: 3, flow: 2 }, |
| 255 | + Edge { from: 1, to: 2, cap: 2, flow: 0 }, |
| 256 | + Edge { from: 1, to: 3, cap: 3, flow: 3 }, |
| 257 | + Edge { from: 2, to: 4, cap: 2, flow: 2 }, |
| 258 | + Edge { from: 3, to: 4, cap: 4, flow: 1 }, |
| 259 | + Edge { from: 3, to: 5, cap: 2, flow: 2 }, |
| 260 | + Edge { from: 4, to: 5, cap: 3, flow: 3 }, |
| 261 | + ] |
| 262 | + ); |
| 263 | + } |
| 264 | + assert_eq!( |
| 265 | + graph.min_cut(0), |
| 266 | + vec![true, false, true, false, false, false] |
| 267 | + ); |
| 268 | + } |
| 269 | + |
| 270 | + #[test] |
| 271 | + fn test_max_flow_wikipedia_multiple_edges() { |
| 272 | + // From https://commons.wikimedia.org/wiki/File:Min_cut.png |
| 273 | + // Under CC BY-SA 3.0 https://creativecommons.org/licenses/by-sa/3.0/deed.en |
| 274 | + let mut graph = MfGraph::new(6); |
| 275 | + for &(u, v, c) in &[ |
| 276 | + (0, 1, 3), |
| 277 | + (0, 2, 3), |
| 278 | + (1, 2, 2), |
| 279 | + (1, 3, 3), |
| 280 | + (2, 4, 2), |
| 281 | + (3, 4, 4), |
| 282 | + (3, 5, 2), |
| 283 | + (4, 5, 3), |
| 284 | + ] { |
| 285 | + for _ in 0..c { |
| 286 | + graph.add_edge(u, v, 1); |
| 287 | + } |
| 288 | + } |
| 289 | + |
| 290 | + assert_eq!(graph.flow(0, 5), 5); |
| 291 | + assert_eq!( |
| 292 | + graph.min_cut(0), |
| 293 | + vec![true, false, true, false, false, false] |
| 294 | + ); |
| 295 | + } |
| 296 | + |
| 297 | + #[test] |
| 298 | + fn test_max_flow_misawa() { |
| 299 | + // Originally by @MiSawa |
| 300 | + // From https://gist.github.com/MiSawa/47b1d99c372daffb6891662db1a2b686 |
| 301 | + let n = 100; |
| 302 | + |
| 303 | + let mut graph = MfGraph::new((n + 1) * 2 + 5); |
| 304 | + let (s, a, b, c, t) = (0, 1, 2, 3, 4); |
| 305 | + graph.add_edge(s, a, 1); |
| 306 | + graph.add_edge(s, b, 2); |
| 307 | + graph.add_edge(b, a, 2); |
| 308 | + graph.add_edge(c, t, 2); |
| 309 | + for i in 0..n { |
| 310 | + let i = 2 * i + 5; |
| 311 | + for j in 0..2 { |
| 312 | + for k in 2..4 { |
| 313 | + graph.add_edge(i + j, i + k, 3); |
| 314 | + } |
| 315 | + } |
| 316 | + } |
| 317 | + for j in 0..2 { |
| 318 | + graph.add_edge(a, 5 + j, 3); |
| 319 | + graph.add_edge(2 * n + 5 + j, c, 3); |
| 320 | + } |
| 321 | + |
| 322 | + assert_eq!(graph.flow(s, t), 2); |
| 323 | + } |
| 324 | +} |
0 commit comments