BOJ 6048 Water Slides

BOJ 6048 Water Slides

문제 링크:

문제 내용

마추픽추에 있는 어떤 워터슬라이드는 VV개의 미니 풀과 이들을 연결하는 EE개의 단방향 미니 슬라이드로 이루어져 있습니다. 각 미니 풀에는 1번부터 VV번까지의 번호가 붙어 있습니다. 1번 미니 풀로 입장하면 하나 이상의 미니 슬라이드를 통해서 VV번 미니 풀에 도착하게 됩니다. 1번을 제외한 모든 미니 풀은 그 풀로 들어오는 미니 슬라이드가 존재하고, VV번을 제외한 모든 미니 풀은 그 풀에서 나가는 미니 슬라이드가 존재합니다. 또한, 모든 미니 풀에서 유한 개의 미니 슬라이드를 통하여 VV번 미니 풀에 도달할 수 있고, 사이클은 존재하지 않습니다.

ii번 미니 슬라이드는 PiP_i번 미니 풀에서 QiQ_i번 미니 풀로 연결되며, 재미의 양을 나타내는 값 FiF_i이 주어집니다. 워터슬라이드를 타면서 얻는 재미는 거쳐간 모든 미니 슬라이드의 재미의 합입니다.

베시는 이 워터슬라이드에서 최대의 재미를 얻고자 각각의 미니 풀에서 다음 미니 슬라이드를 선택할 수 있지만, 내려오는 동안 최대 KK번은 랜덤한 미니 슬라이드를 타게 됩니다. 가능한 최악의 경우의 재미를 최대화하고자 할 때, 베시가 확실하게 얻을 수 있는 재미의 값을 구하세요.

아래는 워터슬라이드의 예시입니다.

          [1]
         /   \
   5 -> /     \ <- 9
       /       \
     [2]---3---[3]
        \__5__/

K=1K = 1이라고 하면, 베시의 선택에 따라 다음과 같은 상황이 될 수 있습니다.

  • 1번 풀에서 재미 9짜리 슬라이드를 선택하면, 얻는 최종 재미는 9입니다.
  • 1번 풀에서 재미 5짜리 슬라이드를 선택하면, 최선은 5+5=10이지만, 2번 풀에서 랜덤으로 3짜리 슬라이드를 타게 되면 8의 재미만 얻을 수 있습니다.
  • 1번 풀에서 랜덤으로 재미 5짜리 슬라이드로 내려왔다면, 2번 풀에서 반드시 5짜리 슬라이드를 고를 수 있습니다.

따라서, 베시가 이 워터슬라이드에서 확실하게 얻을 수 있는 재미는 9입니다.

입력

첫 번째 줄에 VV, EE, KK가 주어집니다. (2V50  0002 \le V \le 50\;000, 1E150  0001 \le E \le 150\;000, 1K101 \le K \le 10)

다음 EE줄에 걸쳐서, ii번째 미니 슬라이드의 시작점 PiP_i, 끝점 QiQ_i, 재미의 값 FiF_i가 한 줄에 주어집니다. (1Pi,QiV1 \le P_i, Q_i \le V, PiQiP_i \neq Q_i, 0Fi2  000  000  0000 \le F_i \le 2\;000\;000\;000)

출력

문제의 정답을 출력합니다.

문제 풀이

스포일러

이 문제는 상대가 있는 게임이론 문제로 생각할 수 있습니다. 여기서 상대의 목표는 베시의 재미를 최소화하는 것이고, 상대는 초기값이 KK인 변수 kk를 가지고 다음과 같은 행동을 원하는 만큼 하거나 하지 않을 수 있습니다.

  • kk가 양수일 때, kk를 1 감소시키고 베시가 다음으로 타게 될 슬라이드를 정합니다.

kk가 0이라면, 각 지점에서 베시의 최선의 선택은 누적되는 재미가 최대인 쪽을 고르면 됩니다. 이는 끝점에서 시작하는 DAG 역순의 DP로 구할 수 있습니다.

kk가 0이 아니라면, 베시의 현재 지점에서 kk를 1 소모할지 말지를 상대가 선택할 수 있습니다.

  • 상대가 kk를 소모한다면 다음 상태는 k1k-1을 가지고 선택된 미니슬라이드의 끝점으로 이동한 상태가 되며, 상대는 그때의 누적되는 재미가 최소인 쪽을 골라야 합니다.
  • 소모하지 않는다면, 베시가 다음 미니슬라이드를 고를 수 있습니다. 이 경우 다음 상태는 kk를 가지고 미니슬라이드의 끝점으로 이동한 상태가 되며, 베시는 누적 재미가 최대인 쪽을 고릅니다.

상대는 다시 둘 중에서 최소를 골라야 합니다. (kk를 소모할지 말지를 선택해야 하기 때문)

이 과정을 DP로 구현하면, O((V+E)K)\mathcal{O}((V+E)K) 시간과 O(VK)\mathcal{O}(VK) 공간으로 문제를 풀 수 있습니다.

Last updated on