Solución

@miguelbr4806y·hace 3dTypeScript
solution.tsTypeScript
export function dinicsMaxFlow(
  n: number,
  source: number,
  sink: number,
  edges: number[][]
): number {
  if (n <= 0 || source < 0 || sink < 0 || source >= n || sink >= n) {
    return 0;
  }

  const m = edges.length;
  const maxEdges = m * 2;

  const head: number[] = new Array(n).fill(-1);
  const to: number[] = new Array(maxEdges).fill(0);
  const next: number[] = new Array(maxEdges).fill(0);
  const capacity: number[] = new Array(maxEdges).fill(0);
  const flow: number[] = new Array(maxEdges).fill(0);
  let edgeCount = 0;

  const addEdge = (u: number, v: number, cap: number): void => {
    // Arista directa (índice par: 0, 2, 4...)
    to[edgeCount] = v;
    capacity[edgeCount] = cap;
    flow[edgeCount] = 0;
    next[edgeCount] = head[u];
    head[u] = edgeCount++;

    // Arista residual (índice impar: 1, 3, 5...)
    to[edgeCount] = u;
    capacity[edgeCount] = 0;
    flow[edgeCount] = 0;
    next[edgeCount] = head[v];
    head[v] = edgeCount++;
  };

  for (let i = 0; i < m; i++) {
    addEdge(edges[i][0], edges[i][1], edges[i][2]);
  }

  const level: number[] = new Array(n).fill(-1);
  const ptr: number[] = new Array(n).fill(-1);

  const bfs = (): boolean => {
    level.fill(-1);
    level[source] = 0;

    const queue: number[] = [source];
    let headIdx = 0;

    while (headIdx < queue.length) {
      const u = queue[headIdx++];

      for (let e = head[u]; e !== -1; e = next[e]) {
        const v = to[e];
        if (capacity[e] - flow[e] > 0 && level[v] === -1) {
          level[v] = level[u] + 1;
          queue.push(v);
        }
      }
    }

    return level[sink] !== -1;
  };

  const dfs = (u: number, pushed: number): number => {
    if (pushed === 0 || u === sink) {
      return pushed;
    }

    for (let e = ptr[u]; e !== -1; e = next[e]) {
      ptr[u] = e;
      const v = to[e];

      if (level[u] + 1 !== level[v] || capacity[e] - flow[e] === 0) {
        continue;
      }

      const tr = dfs(v, Math.min(pushed, capacity[e] - flow[e]));
      if (tr === 0) {
        continue;
      }

      flow[e] += tr;
      flow[e ^ 1] -= tr;
      return tr;
    }

    return 0;
  };

  let maxFlow = 0;
  while (bfs()) {
    for (let i = 0; i < n; i++) {
      ptr[i] = head[i];
    }

    while (true) {
      const pushed = dfs(source, Infinity);
      if (pushed === 0) break;
      maxFlow += pushed;
    }
  }

  return maxFlow;
}
0respuestas
Respuestas

Aún no hay respuestas

¡Sé el primero en responder!

Escribir un comentario

Recuerda ser amable. Estás comentando la solución de otra persona. Comparte tu perspectiva de forma constructiva y respetuosa.

Debes iniciar sesión para publicar un comentario.