도시 계획
시간 제한2초메모리 제한256 MB
주어진 도달 가능성 행렬과 일치하는 가장 작은 일방통행 도로망을 상호 도달 그룹 내부 순환과 그룹 사이 직접 간선으로 복원합니다.
문제
경기도의 한 도시가 새 구역을 지어 도시를 넓히려고 한다. 도시는 여러 건축가를 불렀고, 그중 남서가 도로망 설계를 맡았다. 남서는 일을 줄이려고 구역 안의 지역을 잇는 도로를 모두 일방통행으로 놓았다. 두 지역 와 는 에서 로 가는 도로와 에서 로 가는 도로를 따로 놓아 양쪽으로 이을 수 있다.
설계도를 그려 보니 일방통행 때문에 어떤 지역에서 다른 지역으로 아예 갈 수 없는 경우가 나왔다. 남서는 각 지역 마다 에서 갈 수 있는 지역을 모두 적은 목록을 종이에 옮겼다. 이 목록을 도로망의 '갈 수 있는 지역 목록'이라고 부른다. 에서 로 가는 길과 에서 로 가는 길이 있으면 의 목록에는 와 가, 의 목록에는 가 적힌다.
그런데 하드 디스크가 망가져 설계도가 모두 사라졌다. 남은 것은 책상 위의 종이 한 장, 즉 '갈 수 있는 지역 목록'뿐이다.
이 목록만으로 도로망을 되살리려고 한다. 같은 목록을 만드는 도로망은 여러 가지다. 그중 도로가 가장 적은 도로망을 구하여라.
입력
첫 줄에 테스트 케이스의 개수 ()가 주어진다. 각 테스트 케이스는 빈 줄로 구분된다.
각 테스트 케이스의 첫 줄에 지역의 개수 ()이 주어진다. 지역에는 1번부터 번까지 번호가 붙어 있다. 이어지는 개의 줄에는 길이가 인 문자열이 한 줄씩 주어진다. 번째 줄은 지역 에서 갈 수 있는 지역을 나타낸다. 이 줄의 번째 문자가 0이면 지역 에서 지역 로 갈 수 없고, 1이면 지역 에서 지역 로 가는 방법이 하나 이상 있다. 지역 에서 지역 로는 언제나 갈 수 있으므로 번째 줄의 번째 문자는 항상 1이다.
주어진 목록을 만드는 도로망이 적어도 하나 존재한다.
출력
각 테스트 케이스마다 도로가 가장 적은 도로망을 출력한다. 그런 도로망은 여러 개일 수 있으므로 다음 규칙으로 정해지는 하나만 출력한다.
먼저 서로 오갈 수 있는 지역끼리 하나의 그룹으로 묶는다. 지역 와 는 에서 로 갈 수 있고 에서 로도 갈 수 있을 때 같은 그룹에 속한다. 그룹에 속한 지역 중 번호가 가장 작은 지역을 그 그룹의 대표라고 하자.
- 크기가 2 이상인 그룹에서, 속한 지역을 번호가 커지는 순서로 라 하면 도로 , , , , 을 놓는다. 크기가 1인 그룹 안에는 도로를 놓지 않는다.
- 서로 다른 두 그룹 와 에 대해, 의 지역에서 의 지역으로 갈 수 있고, 에서 갈 수 있으면서 로도 갈 수 있는 제3의 그룹 가 없으면 의 대표에서 의 대표로 가는 도로 하나를 놓는다.
첫 줄에 이렇게 놓은 도로의 개수 을 출력하고, 이어지는 개의 줄에 도로를 한 줄에 하나씩 형식으로 출력한다. 이는 지역 에서 지역 로 가는 일방통행 도로를 뜻한다. 도로는 가 작은 순서로, 가 같으면 가 작은 순서로 정렬해 출력한다. 이 규칙으로 나오는 도로망의 도로 개수는 최소다.
연속한 두 테스트 케이스의 출력 사이에는 빈 줄을 하나 출력한다.