Advertisement
tiom4eg

CS MCMF

May 2nd, 2022
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.40 KB | None | 0 0
  1. struct Edge {
  2. to: int,
  3. next: int,
  4. cap: int,
  5. cost: int
  6. }
  7.  
  8. struct Queue {
  9. l: int[],
  10. r: int[],
  11. function push(self: Queue, x: int) { self.l.push(x); }
  12. function pop(self: Queue) -> int {
  13. if (self.r.length() > 0) {
  14. let x = self.r[self.r.length() - 1];
  15. self.r.pop();
  16. return x;
  17. }
  18. while (self.l.length() > 0) {
  19. let x = self.l[self.l.length() - 1];
  20. self.l.pop();
  21. self.r.push(x);
  22. }
  23. let x = self.r[self.r.length() - 1];
  24. self.r.pop();
  25. return x;
  26. }
  27. function empty(self: Queue) -> bool { return self.l.length() + self.r.length() == 0; }
  28. }
  29.  
  30. function min(a: int, b: int) -> int {
  31. if (a < b) { return a; }
  32. return b;
  33. }
  34.  
  35. function add_edge(by: int, to: int, cap: int, cost: int, edges: Edge[], head: int[]) {
  36. edges.push(new Edge { to: to, next: edges.length() + 2, cap: cap, cost: cost });
  37. head[by] = edges.length() + 1;
  38. }
  39.  
  40. function add(u: int, v: int, cap: int, cost: int, edges: Edge[], head: int[]) {
  41. add_edge(u, v, cap, cost, edges, head);
  42. add_edge(v, u, 0, -cost, edges, head);
  43. }
  44.  
  45. function spfa(n: int, s: int, t: int, pre: int[], vis: int[], c: int[], edges: Edge[], head: int[]) -> bool {
  46. for (let i = 1; i <= n; i += 1) { pre[i] = -1; vis[i] = 0; c[i] = 1000000000000000000; }
  47. let q = new Queue { l: [], r: [] };
  48. q.push(s);
  49. vis[s] = 1; c[s] = 0;
  50. while (!q.empty()) {
  51. let u = q.pop();
  52. vis[u] = 0;
  53. for (let i = head[u]; i != 0; i = edges[i].next) {
  54. let v = edges[i].to;
  55. if (edges[i].cap > 0 && c[v] > c[u] + edges[i].cost) {
  56. c[v] = c[u] + edges[i].cost;
  57. pre[v] = i;
  58. if (vis[v] != 0) {
  59. vis[v] = 1;
  60. q.push(v);
  61. }
  62. }
  63. }
  64. }
  65. return pre[t] != -1;
  66. }
  67.  
  68. function mcmf(n: int, s: int, t: int, pre: int[], vis: int[], c: int[], edges: Edge[], head: int[]) -> int {
  69. let max_flow = 0;
  70. let min_cost = 0;
  71. while (spfa(n, s, t, pre, vis, c, edges, head)) {
  72. let x = t;
  73. let flow = 1000000000;
  74. while (x != s) { flow = min(flow, edges[pre[x]].cap); x = edges[pre[x] ^ 1].to; }
  75. max_flow += flow;
  76. x = t;
  77. min_cost += c[t] * flow;
  78. while (x != s) {
  79. edges[pre[x]].cap -= flow;
  80. edges[pre[x] ^ 1].cap += flow;
  81. x = edges[pre[x] ^ 1].to;
  82. }
  83. }
  84. return min_cost;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement