가장 긴 외판원 순회
시간 제한1초메모리 제한256 MB
트리의 모든 정점을 하나의 순환 경로로 나열해 전체 이동 거리를 최대로 만들고 그중 사전 순으로 가장 앞선 순열을 출력합니다.
문제
카렐은 로봇 대회에 자신의 로봇을 등록하려고 한다. 등록하려면 로봇의 안전 인증서를 받고 여러 서류를 작성해야 한다. 그래서 대회 주최 측 건물 입구에서 출발해 정해진 순서대로 사무실을 모두 한 번씩 들른 다음 다시 입구로 돌아와야 한다. 다행히 건물 복도는 사이클을 이루지 않아서, 두 사무실 사이의 경로는 언제나 하나뿐이다.
대회를 열려면 문제 지문과 정답 코드만으로는 부족하다. 제출된 코드를 검증할 테스트 데이터도 만들어야 한다. 특히 비효율적인 풀이를 걸러내려면 걷는 거리가 가장 긴 방문 순서가 필요하다. 그 순서를 찾아라.
건물은 정점이 개인 트리이고, 각 정점에 사무실이 하나씩 있다. 트리는 간선으로 이어진 정점의 모임이다. 간선 하나는 정점 두 개를 잇고, 임의의 두 정점 와 사이에는 경로가 정확히 하나 있다. 경로의 길이는 에서 로 갈 때 지나는 간선의 수이고, 이를 로 쓴다.
입력
입력은 여러 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫 줄에는 트리의 정점 수 ()이 주어진다. 정점 번호는 부터 까지다. 이어지는 개 줄 가운데 번째 줄에는 정수 ()가 주어진다. 이는 정점 와 정점 를 잇는 간선이 트리에 있다는 뜻이다.
각 테스트 케이스 뒤에는 빈 줄이 하나 온다. 입력은 파일이 끝나면 함께 끝난다. 테스트 케이스는 개 이하이고, 모든 테스트 케이스의 을 더한 값은 이하다.
출력
각 테스트 케이스마다 한 줄에 정수 개 을 공백으로 구분해 출력한다. 이 각각 정확히 한 번씩 나와야 하고, 합
이 가능한 최댓값이어야 한다.
합을 최대로 만드는 순열은 보통 여러 개다. 그중 사전순으로 가장 앞서는 순열 하나만 출력한다. 두 순열을 앞에서부터 비교해 값이 처음으로 달라지는 자리에서 더 작은 수가 놓인 쪽이 사전순으로 앞선다.