아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

합리적인 순위

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

요약
완전 토너먼트의 승패 표가 주어질 때, 위에 있는 선수와 아래에 있는 선수 사이에 중간 선수들을 거치는 승리 사슬이 존재하도록 하는 사전순 최소 순위를 구한다.
난이도

어려움10점 중 8점

유형
그래프, 위상 정렬, 그리디, DFS
정답자
아직 제출이 없습니다

문제

최근 대규모 스타크래프트 II 리그가 열렸습니다. 이 대회에는 NN명의 선수가 참가했고, 모든 선수는 서로 정확히 한 번씩 경기를 치렀습니다(라운드 로빈). 경기 결과는 N×NN \times N 크기의 표에 기록되었지만, 표만 보아서는 어떤 선수가 더 강한지 한눈에 알기 어렵습니다. 그래서 대회 주최자인 당신은 선수들의 합리적인 순위를 만들기로 했습니다.

서로 다른 두 선수 xx와 yy가 있고, xx가 yy보다 높은 순위에 있다고 합시다. 순서쌍 (x,y)(x, y)가 합리적이라는 것은 다음 두 조건 중 적어도 하나를 만족한다는 뜻입니다.

  1. 선수 xx가 선수 yy와의 경기에서 이겼다. 또는
  2. 순위상 xx와 yy 사이에 위치한 또 다른 선수 zz가 존재하여, (x,z)(x, z)와 (z,y)(z, y)가 모두 합리적이다.

모든 선수를 높은 순위부터 낮은 순위까지 나열한 순위가 합리적인 순위라는 것은, xx가 yy보다 높은 순위인 모든 쌍 (x,y)(x, y)가 합리적이라는 뜻입니다.

결과 표가 주어질 때, 선수들의 합리적인 순위를 구하세요.

입력

입력은 여러 개의 테스트 케이스로 이루어집니다. 각 테스트 케이스의 첫 줄에는 선수의 수를 나타내는 정수 NN (1≤N≤1,0001 \le N \le 1{,}000)이 주어집니다. 이어지는 NN개의 줄은 승패 표 MM을 나타냅니다. 각 줄은 문자 '0'과 '1'로만 이루어진 길이 NN의 문자열이며, 앞뒤에 공백은 없습니다. ii번째 줄의 jj번째 문자 MijM_{ij}는 선수 ii가 선수 jj를 이겼으면 1, 그렇지 않으면 0입니다. i≠ji \ne j인 모든 경우에 대해 MijM_{ij}와 MjiM_{ji} 중 정확히 하나만 1입니다(무승부는 없습니다). 또한 모든 ii에 대해 Mii=0M_{ii} = 0입니다. 입력의 마지막에는 N=0N = 0인 줄이 하나 주어지며, 이 줄은 처리하지 않습니다.

출력

각 테스트 케이스에 대해, 선수들의 합리적인 순위를 가장 높은 순위의 선수부터 가장 낮은 순위의 선수까지 공백으로 구분하여 한 줄에 출력하세요. 합리적인 순위는 여러 개일 수 있으므로, 그중 사전순으로 가장 앞서는 것을 출력합니다(순위를 선수 번호의 수열로 보고 비교합니다). 만약 합리적인 순위가 존재하지 않으면, 대신 (따옴표 없이) impossible을 출력하세요.

예제5

  1. 예제 1

    입력
    3
    010
    001
    100
    5
    00110
    10011
    01000
    00101
    10100
    0
    
    예상 출력
    1 2 3
    1 3 2 4 5
    
  2. 예제 2

    입력
    1
    0
    0
    
    예상 출력
    1
    
  3. 예제 3

    입력
    2
    01
    00
    0
    
    예상 출력
    1 2
    
  4. 예제 4

    입력
    6
    011111
    001111
    000111
    000011
    000001
    000000
    0
    
    예상 출력
    1 2 3 4 5 6
    
  5. 예제 5

    입력
    3
    010
    001
    100
    1
    0
    2
    00
    10
    4
    0111
    0011
    0001
    0000
    0
    
    예상 출력
    1 2 3
    1
    2 1
    1 2 3 4