Advertisement
Guest User

Untitled

a guest
Apr 29th, 2016
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.73 KB | None | 0 0
  1. const START: usize = 1;
  2. const END: usize = 5;
  3.  
  4. fn main() {
  5.  
  6. /*let mut edges = [
  7. (1, 3, 6, 6),
  8. (1, 2, 5, 5),
  9. (1, 4, 5, 5),
  10. (2, 5, 3, 3),
  11. (2, 3, 2, 2),
  12. (4, 3, 3, 3),
  13. (4, 6, 5, 5),
  14. (3, 5, 3, 3),
  15. (3, 6, 7, 7),
  16. (5, 7, 8, 8),
  17. (5, 6, 1, 1),
  18. (6, 7, 7, 7)
  19. ];*/
  20.  
  21. let mut edges = [
  22. (1, 2, 20, 0),
  23. (1, 3, 30, 0),
  24. (1, 4, 10, 0),
  25. (2, 3, 40, 0),
  26. (2, 5, 30, 0),
  27. (3, 5, 20, 0),
  28. (3, 4, 10, 5),
  29. (4, 5, 20, 0)
  30. ];
  31.  
  32. let mut paths: Vec<(Vec<usize>, usize)> = Vec::new();
  33. while let Some((vec, min)) = traverse(START, edges.iter(), (Vec::new(), 0)) {
  34. paths.push((vec.clone(), min));
  35. let c_edges = edges.clone();
  36. let mut enumeration = c_edges.iter().enumerate().collect::<Vec<_>>();
  37. for (&n1, &n2) in vec.iter().zip(vec.iter().skip(1)) {
  38. let c_enumeration = enumeration.clone();
  39. let path = c_enumeration.iter().find(|&&(_, &(on1, on2, _, _))|
  40. n1 == on1 && n2 == on2 || n1 == on2 && n2 == on1).unwrap();
  41. match path {
  42. &(index, &(on1, on2, _, _)) if n1 == on1 && n2 == on2 => {
  43. edges[index].2 -= min;
  44. edges[index].3 += min;
  45. }
  46. &(index, &(on1, on2, _, _)) if n1 == on2 && n2 == on1 => {
  47. edges[index].3 -= min;
  48. edges[index].2 += min;
  49. }
  50. _ => {}
  51. }
  52. enumeration = enumeration.iter().filter(|&p| p != path).cloned().collect();
  53. }
  54. }
  55. println!("{:?}\nMaximum flow: {}",
  56. paths, paths.clone().iter().fold(0, |acc, &(_, min)| acc + min));
  57. }
  58.  
  59.  
  60. fn traverse<'a, I>(current_node: usize, iter: I, state: (Vec<usize>, usize)) ->
  61. Option<(Vec<usize>, usize)>
  62. where I: Iterator<Item=&'a (usize, usize, usize, usize)> + Clone {
  63. let mut vec = state.0.clone();
  64. vec.push(current_node);
  65.  
  66. if current_node == END {
  67. return Some((vec.clone(), state.1));
  68. }
  69.  
  70. let paths = iter.clone()
  71. .filter(|&&(n1, n2, _, _)| n1 == current_node || n2 == current_node)
  72. .map(|p| {
  73. if p.0 == current_node { (p.1, p.2, p) }
  74. else { (p.0, p.3, p) }
  75. });
  76.  
  77. paths
  78. .filter(|&(next,val,_)| !vec.iter().any(|&n| n == next) && val != 0)
  79. .map(|(next, val, path)| traverse(next,
  80. iter.clone().filter(|&p| p != path).collect::<Vec<_>>().into_iter(),
  81. (vec.clone(), if state.1 == 0 || val < state.1 { val } else { state.1 })))
  82. .find(|opt| opt.is_some() &&
  83. opt.as_ref().unwrap().0.clone().pop().unwrap() == END).unwrap_or(None)
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement