해밀턴 회로

토너먼트 그래프에서 주어진 두 규칙으로 정점을 사이클에 하나씩 끼워 넣고 규칙이 막히면 -1을 출력합니다.

보통7그래프시뮬레이션아직 제출이 없습니다시간 제한1.5초메모리 제한512 MB

문제

정점이 NN개, 간선이 N(N1)/2N(N-1)/2개인 방향 그래프 GG가 있다. 정점 번호는 0부터 N1N-1까지다. 서로 다른 두 정점 iijj 사이에는 ii에서 jj로 가는 간선과 jj에서 ii로 가는 간선 중 정확히 하나만 있다. 따라서 간선의 방향을 무시하면 GG는 완전 그래프다.

XXGG의 인접 행렬이다. Xi,jX_{i,j}+이면 ii에서 jj로 가는 간선이 있고, -이면 없다. Xi,iX_{i,i}는 항상 .이다.

GG의 해밀턴 회로는 GG의 모든 정점을 한 번씩 지나는 길이 NN짜리 사이클이다. GG가 주어지면 해밀턴 회로가 있는지 판정하고, 있으면 하나를 출력한다.

입력

첫째 줄에 정점의 개수 NN이 주어진다. 둘째 줄부터 NN개의 줄에 인접 행렬 XX가 주어진다. 이 중 ii번째 줄의 jj번째 문자가 Xi,jX_{i,j}이다.

출력

GG에 해밀턴 회로가 없으면 -1을 출력한다.

있으면 해밀턴 회로가 지나는 정점 NN개를 지나는 순서대로 공백 하나로 구분해 출력한다. 해밀턴 회로가 여러 개일 수 있으므로, 아래 절차가 만드는 회로를 그대로 출력한다.

서로 다른 정점을 담은 수열 c0,c1,,ck1c_0, c_1, \dots, c_{k-1}을 유지한다. 이 수열은 사이클 c0c1ck1c0c_0 \to c_1 \to \dots \to c_{k-1} \to c_0을 뜻하고, (ck1,c0)(c_{k-1}, c_0)을 포함해 이웃한 모든 쌍은 GG의 간선이다. 정점 0 하나만 담은 수열에서 시작해, 수열이 정점 NN개를 모두 담을 때까지 다음을 반복한다. 수열에 없는 정점을 자유 정점이라고 부른다.

  1. 어떤 자유 정점 vv에 대해 수열의 정점에서 vv로 가는 간선과 vv에서 수열의 정점으로 가는 간선이 모두 있으면, 그런 vv 중 가장 작은 것을 고른다. Xci,vX_{c_i,v}+이고 Xv,c(i+1)modkX_{v,c_{(i+1) \bmod k}}+인 가장 작은 첨자 ii를 찾아 vvcic_i 바로 뒤에 넣는다. 그런 ii는 항상 있다.
  2. 그렇지 않으면 자유 정점 쌍 (w,u)(w, u) 중에서 수열의 모든 정점에서 ww로 가는 간선이 있고, uu에서 수열의 모든 정점으로 가는 간선이 있으며, ww에서 uu로 가는 간선도 있는 쌍을 모은다. 그중 사전순으로 가장 작은 쌍을 골라 수열 끝에 ww, uu 순서로 덧붙인다.

GG에 해밀턴 회로가 있으면 매 단계에서 두 규칙 중 하나가 반드시 적용되고, 수열의 맨 앞은 계속 정점 0이므로 출력하는 회로는 정점 0에서 시작한다.

제한

  • 3N10003 \le N \le 1\,000