최소 신장 트리

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

요약
가중 그래프와 중첩 목록으로 주어진 여러 신장 트리에 대해 각각이 최소 신장 트리인지 판정한다.
난이도

보통10점 중 7점

유형
최소 신장 트리, 유니온 파인드, 정렬, 구현
정답자
아직 제출이 없습니다

문제

GG는 연결된 가중 무방향 그래프이다. GG의 신장 트리(spanning tree) TT는 (1) 트리이면서 (2) GG의 모든 정점을 연결하는 부분 그래프이다. 신장 트리의 가중치는 그 트리에 속한 간선들의 가중치 합이다. 최소 신장 트리(minimum spanning tree)는 다른 모든 신장 트리보다 가중치가 작거나 같은 신장 트리이다.

주어진 트리 TT가 주어진 그래프 GG의 최소 신장 트리인지 판별하는 프로그램을 작성하시오.

입력

입력은 하나 이상의 테스트 케이스로 이루어진다. 각 테스트 케이스에서는 그래프 GG와 검사할 트리들이 주어진다.

각 테스트 케이스의 첫 줄에는 GG의 정점 수를 나타내는 정수 nn (1<n≤10001 < n \le 1000)이 주어진다. 정점은 11번부터 nn번까지 번호가 매겨진다.

이어지는 n−1n-1개의 줄에는 가중치 인접 행렬의 상삼각 부분이 다음과 같이 주어진다.

W(1,2) W(1,3) ... W(1,n-1) W(1,n)
W(2,3) W(2,4) ... W(2,n)
...
W(n-1,n)

여기서 Wi,jW_{i,j} (0≤Wi,j≤10000 \le W_{i,j} \le 1000)는 정점 ii와 jj 사이 간선의 가중치이며, Wi,j=0W_{i,j} = 0은 두 정점 사이에 간선이 없음을 뜻한다.

행렬 다음 줄에는 이 그래프에 대해 검사할 트리의 개수 QQ (0<Q≤10000 < Q \le 1000)가 주어진다.

이어서 주어지는 QQ개의 트리는 각각 정점 번호 하나로 된 단일 정점이거나, 다음 형식으로 표현된다.

(R T1 T2 ... Tc)

여기서 RR은 루트 정점의 번호이고, T1,…,TcT_1, \dots, T_c (0<c≤10000 < c \le 1000)는 RR의 부분 트리로 같은 방식으로 재귀적으로 표현된다.

입력의 끝은 nn 자리에 00 하나만 있는 줄로 표시된다.

출력

각 트리마다 다음 형식으로 한 줄씩 출력한다.

a.b result

여기서 aa는 테스트 케이스 번호(11부터 시작), bb는 해당 테스트 케이스 안에서의 트리 번호(11부터 시작)이며, result는 그 트리가 GG의 최소 신장 트리이면 YES, 아니면 NO이다. bb와 result 사이에는 공백 하나를 두고, 줄 끝에 불필요한 공백을 남기지 않는다.

예제1

  1. 예제 1

    입력
    6 
    2  6 11 0 0 
    0 10  0 0 
    0  0  7 
    3  4 
    5 
    3 
    (6 (3 (1 2)) (4 5)) 
    (3 (1 2) (6 (4 5))) 
    (4 1 2 5 6) 
    5
     6 6  0 6 
     6 0 10 
    10 6 
    10 
    2 
    (1 2 5 (3 4)) 
    (5 4 (3 2 1)) 
    0
    
    예상 출력
    1.1 YES
    1.2 YES
    1.3 NO
    2.1 YES
    2.2 YES