해밀턴 회로
시간 제한1.5초메모리 제한512 MB
토너먼트 그래프에서 주어진 두 규칙으로 정점을 사이클에 하나씩 끼워 넣고 규칙이 막히면 -1을 출력합니다.
문제
정점이 개, 간선이 개인 방향 그래프 가 있다. 정점 번호는 0부터 까지다. 서로 다른 두 정점 와 사이에는 에서 로 가는 간선과 에서 로 가는 간선 중 정확히 하나만 있다. 따라서 간선의 방향을 무시하면 는 완전 그래프다.
는 의 인접 행렬이다. 가 +이면 에서 로 가는 간선이 있고, -이면 없다. 는 항상 .이다.
의 해밀턴 회로는 의 모든 정점을 한 번씩 지나는 길이 짜리 사이클이다. 가 주어지면 해밀턴 회로가 있는지 판정하고, 있으면 하나를 출력한다.
입력
첫째 줄에 정점의 개수 이 주어진다. 둘째 줄부터 개의 줄에 인접 행렬 가 주어진다. 이 중 번째 줄의 번째 문자가 이다.
출력
에 해밀턴 회로가 없으면 -1을 출력한다.
있으면 해밀턴 회로가 지나는 정점 개를 지나는 순서대로 공백 하나로 구분해 출력한다. 해밀턴 회로가 여러 개일 수 있으므로, 아래 절차가 만드는 회로를 그대로 출력한다.
서로 다른 정점을 담은 수열 을 유지한다. 이 수열은 사이클 을 뜻하고, 을 포함해 이웃한 모든 쌍은 의 간선이다. 정점 0 하나만 담은 수열에서 시작해, 수열이 정점 개를 모두 담을 때까지 다음을 반복한다. 수열에 없는 정점을 자유 정점이라고 부른다.
- 어떤 자유 정점 에 대해 수열의 정점에서 로 가는 간선과 에서 수열의 정점으로 가는 간선이 모두 있으면, 그런 중 가장 작은 것을 고른다. 가
+이고 가+인 가장 작은 첨자 를 찾아 를 바로 뒤에 넣는다. 그런 는 항상 있다. - 그렇지 않으면 자유 정점 쌍 중에서 수열의 모든 정점에서 로 가는 간선이 있고, 에서 수열의 모든 정점으로 가는 간선이 있으며, 에서 로 가는 간선도 있는 쌍을 모은다. 그중 사전순으로 가장 작은 쌍을 골라 수열 끝에 , 순서로 덧붙인다.
에 해밀턴 회로가 있으면 매 단계에서 두 규칙 중 하나가 반드시 적용되고, 수열의 맨 앞은 계속 정점 0이므로 출력하는 회로는 정점 0에서 시작한다.