BOJ 1658 돼지 잡기

BOJ 1658 돼지 잡기

문제 링크:

문제 내용

MM개의 돼지우리에 1,2,,M1, 2, \cdots, M의 번호가 매겨져 있으며, ii번 돼지우리에는 현재 PiP_i마리의 돼지가 있습니다.

NN명의 손님이 순서대로 와서 다음과 같은 방식으로 돼지를 사 가려고 합니다.

  • ii번째 손님은 Ki1,Ki2,,KiAiK_{i1}, K_{i2}, \cdots, K_{iA_i}번 돼지우리를 열고, 열린 돼지우리에서 최대 BiB_i마리의 돼지를 사 갑니다.
  • 그 뒤에는 열린 돼지우리에 남아있는 돼지들을 원하는 대로 재분배한 뒤 돼지우리들을 모두 닫습니다.

이때 팔 수 있는 돼지의 수의 최댓값을 구하세요.

입력

첫 줄에는 돼지우리의 수 MM과 손님의 수 NN이 주어집니다. (1M10001 \le M \le 1000, 1N1001 \le N \le 100)

두 번째 줄에는 각 돼지우리에 있는 돼지의 수 PiP_i가 순서대로 주어집니다. (0Pi10000 \le P_i \le 1000)

다음 NN줄에는 각각 ii번째 손님의 행동을 나타내는 값 Ai,Ki1,Ki2,,KiA,BiA_i, K_{i1}, K_{i2}, \cdots, K_{iA}, B_i가 주어집니다. (0AM0 \le A \le M, 0B1090 \le B \le 10^9)

문제 풀이

스포일러

이 문제는 다음과 같이 플로우 문제로 모델링할 수 있습니다. 1 단위의 흐름은 돼지 1마리의 이동으로 볼 수 있습니다.

  • 각각의 돼지우리에 대해 노드를 만들고, 소스와 각각의 돼지우리를 용량 PiP_i의 간선으로 연결합니다.
  • 각 손님에 대해 노드를 만들고, 이들 노드와 싱크를 용량 BiB_i의 간선으로 연결합니다.
  • 각 손님이 여는 돼지우리의 번호에 대해서, 그 돼지우리를 마지막으로 열었던 손님의 노드로부터 현재 노드로 가는 용량 \infty의 간선을 만듭니다. 그러한 손님이 없었다면 돼지우리 노드에서 직접 연결합니다.

그러면 각각의 돼지의 모든 흐름을 이 플로우 그래프 내에서 표현할 수 있습니다. 이제 최대 용량 알고리즘을 적용하여 답을 구하면 됩니다.

Last updated on