핑크 플로이드

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

요약
가중치 트리의 모든 쌍 최단 거리 행렬이 주어졌을 때, 이 거리를 만드는 트리를 복원해 인접 리스트로 출력한다.
난이도

어려움10점 중 8점

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

문제

재현이는 NN개의 정점으로 이루어진 트리를 가지고 있었다. 정점에는 11번부터 NN번까지 번호가 매겨져 있고, 트리를 이루는 N−1N-1개의 간선에는 그 간선이 잇는 두 정점 사이의 거리(양의 정수)가 저장되어 있었다. 재현이는 트리를 아끼는 만큼 넉넉한 메모리를 주고 싶어서, 모든 간선을 N×NN \times N 인접 행렬에 저장했다.

그런데 재현이와 인접 행렬을 모두 싫어하는 수찬이가 이 행렬에 플로이드-워셜 알고리즘을 돌려, 행렬의 모든 칸을 해당하는 두 정점 사이의 최단 거리로 바꿔 버렸다. 이제 재현이에게 남은 것은 모든 정점 쌍의 최단 거리를 담은 행렬뿐이다.

흉하게 변해 버린 트리를 본 재현이는 더 이상 트리에 넉넉한 메모리를 주고 싶지 않아, 트리를 인접 리스트로 저장하려고 한다.

수찬이가 플로이드-워셜을 돌려 만든 인접 행렬(즉, 모든 정점 쌍의 최단 거리 행렬)이 주어질 때, 원래 트리를 인접 리스트 형태로 복원하여 출력하여라. 입력으로 주어지는 행렬은 항상 어떤 트리로부터 만들어진 올바른 거리 행렬임이 보장된다.

입력

첫째 줄에 트리의 정점 수 NN이 주어진다. (3≤N≤10243 \le N \le 1024)

다음 N−1N-1개의 줄에는 정점 쌍 사이의 최단 거리가, 인접 행렬의 위쪽 삼각형(주대각선의 위·오른쪽 부분)만 순서대로 주어진다. 즉, 첫 번째 줄에는 정점 11과 2,3,…,N2, 3, \dots, N 사이의 거리가, 두 번째 줄에는 정점 22와 3,4,…,N3, 4, \dots, N 사이의 거리가, 일반적으로 ii번째 줄에는 정점 ii와 i+1,i+2,…,Ni+1, i+2, \dots, N 사이의 거리가 주어진다.

모든 거리는 1500015000 이하의 양의 정수이다.

출력

NN개의 줄에 걸쳐 트리를 인접 리스트 형태로 출력한다.

ii번째 줄에는 정점 ii와 직접 연결된 정점의 개수를 먼저 출력하고, 이어서 연결된 정점들의 번호를 오름차순으로 출력한다.

예제3

  1. 예제 1

    입력
    5
    5 14 3 7
    13 2 6
    11 7
    4
    
    예상 출력
    1 4
    1 4
    1 5
    3 1 2 5
    2 3 4
    
  2. 예제 2

    입력
    3
    3 8
    5
    
    예상 출력
    1 2
    2 1 3
    1 2
    
  3. 예제 3

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