Last Man Standing

시간 제한1초메모리 제한1024 MB

요약
참가자 사이의 화제성 점수가 주어질 때, N-K번의 대결 결과를 정해 K명만 남기면서 모든 대결 화제성 합을 최대로 만들고 그 대결 순서를 출력한다.
난이도

어려움10점 중 8점

유형
그래프, 그리디, 정렬, 구현
정답자
아직 제출이 없습니다

문제

당신은 NN명의 참가자 중 KK명을 남기는 서바이벌 프로그램을 만들고 있다. N−KN-K개의 대결을 통해 최후 생존하는 KK명을 뽑으려고 한다.

대결은 두 사람끼리 이루어지며, 패배한 쪽은 탈락한다.

서로 다른 두 사람 ii와 jj의 대결은 M_ijM\_{ij}의 화제성을 가지고 있다. 대회의 흥행도는 모든 대결의 화제성의 합을 말한다.

당신은 대회의 흥행도를 최대화하기 위해 대결의 결과를 맘대로 정할 것이다.

대회의 흥행도의 최댓값과, 그 때의 대결 순서를 알아내 보자!

입력

첫째 줄에 참가자의 수 NN, 생존자의 수 KK가 공백으로 구분되어 주어진다. (1≤K≤N≤1,000)(1 \leq K \leq N \leq 1\\,000)

둘째 줄부터 NN개의 줄에 걸쳐 ii와 jj가 대결하였을 때의 화제성을 나타내는 값 M_i1,M_i2,⋯ ,M_iNM\_{i1}, M\_{i2}, \cdots, M\_{iN}이 공백으로 구분되어 주어진다.

  • i≠ji \ne j :: (1≤M_ij≤1,000,000; M_ij=M_ji)(1 \le M\_{ij} \le 1\\,000\\,000; \ M\_{ij} = M\_{ji})
  • i=ji = j :: (M_ij=0)(M\_{ij} = 0)

주어지는 모든 수는 정수이다.

출력

첫째 줄에 대회의 흥행도의 최댓값을 출력한다.

다음 줄부터 N−KN-K개 줄에 걸쳐 ii번째 대결의 승자와 패자를 공백으로 구분하여 출력한다.

예제1

  1. 예제 1

    입력
    5 2
    0 4 7 10 2
    4 0 9 3 8
    7 9 0 5 1
    10 3 5 0 6
    2 8 1 6 0
    
    예상 출력
    27
    4 1
    2 3
    5 2