경주 지도 라벨 붙이기
시간 제한2초메모리 제한256 MB
번호가 가장 작은 위반 정점의 라벨을 뒤집는 과정을 끝까지 시뮬레이션한 뒤 각 정점의 최종 라벨을 출력합니다.
문제
모터사이클 경주 조직위원회가 대회 지도에 라벨을 붙이려 한다. 지도에는 장소 개가 있고, 각 장소에는 번부터 번까지 번호가 붙어 있다. 모든 도로는 양방향이고 서로 다른 두 장소를 잇는다.
각 장소에는 일반을 뜻하는 이나 지원을 뜻하는 을 라벨로 붙인다. 장소 에 닿아 있는 도로가 개일 때, 장소 와 라벨이 같은 이웃은 최대 개까지만 허용한다. 이 조건을 지키는 라벨링은 보통 여러 가지이므로, 다음 절차가 만들어내는 라벨링 하나만 정답으로 인정한다.
- 모든 장소의 라벨을 으로 둔다.
- 조건을 어기는 장소가 있으면 그중 번호가 가장 작은 장소를 골라 라벨을 뒤집는다. 즉 이면 로, 이면 으로 바꾼다.
- 조건을 어기는 장소가 하나도 남지 않을 때까지 2를 반복한다.
라벨을 한 번 뒤집을 때마다 양 끝의 라벨이 서로 다른 도로의 수가 최소 늘어나므로, 이 절차는 항상 유한 번 만에 끝난다.
입력
첫 줄에 장소의 수 이 주어진다. ()
다음 개 줄 가운데 번째 줄은 장소 를 설명한다. () 각 줄의 형식은 다음과 같다.
number_of_neighbors: neighbor1 neighbor2 ... neighborm
number_of_neighbors는 장소 에 닿아 있는 도로의 수이고, 그 뒤에 이웃 장소의 번호가 공백으로 구분되어 나열된다. 2: 1 2는 이웃이 둘이고 그 번호가 과 라는 뜻이다.
한 도로가 같은 장소를 두 번 잇는 경우는 없고, 같은 두 장소를 잇는 도로도 하나뿐이다. 장소 의 이웃 목록에 가 있으면 장소 의 이웃 목록에도 가 있다. 이웃이 없는 장소의 줄은 콜론에서 끝난다.
출력
첫 줄에 을 출력한다. 이어서 개 줄에 장소 번부터 차례로 라벨을 붙여 출력한다. 각 줄의 형식은 다음과 같다.
label number_of_neighbors: neighbor1 neighbor2 ... neighborm
label은 일반이면 , 지원이면 이다. 이웃 목록은 입력에 주어진 순서 그대로 출력한다. 토큰 사이는 공백 하나로 구분하고, 콜론은 number_of_neighbors 바로 뒤에 붙여 쓴다. 이웃이 없는 장소의 줄은 콜론에서 끝난다.