다리 놓기

시간 제한2초메모리 제한64 MB

요약
가중치 트리에서 k개의 도로를 골라 더 빠른 속도로 바꿔 모든 정점 쌍의 이동 시간 합을 최소화하고, 동일하면 사전순으로 가장 작은 답을 구하는 문제입니다.
난이도

어려움10점 중 8점

유형
트리, 그리디, 동적 계획법, 조합론
정답자
아직 제출이 없습니다

문제

먼 옛날, 어느 강의 삼각주에 한 나라가 있었다. 이 나라에는 nn개의 섬이 있고, 각 섬에는 마을이 하나씩 있었다. 마을들은 도로로 연결되어 있었으며, 임의의 두 마을 사이에는 (중간 마을들을 거칠 수도 있는) 유일한 경로가 존재했다. 즉, 마을과 도로는 하나의 트리를 이룬다.

모든 도로는 강을 여울로 건넜다. 다리를 놓는 기술이 없었기 때문에 여울을 건너는 일은 불편했고, 오직 말을 타고서만 건널 수 있었다.

다리를 놓는 기술이 발견되자 왕은 일부 여울을 다리로 바꾸어 그 도로들을 더 편히 다닐 수 있게 하기로 했다. 다리가 놓인 도로는 마차로 건널 수 있다. 그러나 나라가 가난하여 다리는 kk개만 지을 수 있다.

모든 마을 쌍 사이의 총 이동 시간이 최소가 되도록 다리를 놓을 kk개의 도로를 골라야 한다. 다리가 없는 도로는 속도 shs_h의 말로, 다리가 있는 도로는 속도 scs_c의 마차로 이동한다(속도의 단위는 초당 미터). 길이 ll인 도로 하나를 지나는 데 걸리는 시간은 말로는 l/shl / s_h, 마차로는 l/scl / s_c이다. 두 마을 사이의 이동 시간은 두 마을을 잇는 유일한 경로 위 도로들의 이동 시간의 합이며, 총 이동 시간은 서로 다른 모든 마을 쌍에 대한 그 값의 합이다.

입력

첫째 줄에 네 정수 nn, kk, shs_h, scs_c가 주어진다. 각각 마을의 수, 지을 다리의 수(1≤k<n≤10 0001 \le k < n \le 10\,000), 말의 속도, 마차의 속도(초당 미터, 1≤sh,sc≤100 0001 \le s_h, s_c \le 100\,000)이다.

이어지는 n−1n - 1개의 줄에는 각각 세 정수 bib_i, eie_i, lil_i가 주어지며, 이는 도로 ii가 잇는 두 마을과 그 도로의 길이(미터, 1≤li≤1061 \le l_i \le 10^6)를 뜻한다. 마을은 11번부터 nn번까지, 도로는 주어지는 순서대로 11번부터 n−1n - 1번까지 번호가 매겨진다.

출력

총 이동 시간이 최소가 되도록 다리를 놓을 kk개의 도로 번호를 출력한다. 한 줄에 오름차순으로, 공백 하나로 구분하여 출력한다.

총 이동 시간을 최소로 만드는 방법이 여러 가지라면 사전순으로 가장 작은 것을 출력한다. 즉, 각 방법에서 고른 도로 번호들을 오름차순으로 나열했을 때, 모든 최적해 중 사전순으로 가장 앞서는 수열을 출력한다.

힌트

그림은 예시 상황을 나타낸다.

예제2

  1. 예제 1

    입력
    6 2 1 2
    1 2 5
    3 2 6
    1 4 4
    4 6 4
    4 5 5
    
    예상 출력
    1 3
    
  2. 예제 2

    입력
    5 2 1 3
    1 2 10
    2 3 10
    3 4 10
    4 5 10
    
    예상 출력
    2 3