전화망
시간 제한2초메모리 제한128 MB
재귀적인 이진 스위치 네트워크에서 m개의 입출력 요청을 겹치지 않게 배선하되, 각 계층마다 사전순으로 가장 작은 라우팅 비트열을 선택해야 합니다.
문제
어느 전화 회사가 도시에 새 전화망을 놓으려고 한다. 도시의 모든 사람이 서로 통화할 수 있게 하는 것이 목표다. 모든 사람 쌍을 직접 잇는 것은 불가능하므로, 회사는 여러 층으로 이루어진 망을 쓴다.
층의 교환기를 라고 쓴다. 은 입력 하나, 출력 하나, 그리고 그 입력과 출력을 잇는 케이블 하나로 이루어진다. 인 는 입력 개, 출력 개, 그리고 두 개로 이루어진다. 의 입력 ()는 두 각각의 입력 과 케이블로 이어져 있다. 출력도 마찬가지여서, 의 출력 는 두 각각의 출력 과 이어져 있다.
가장 바깥 층이 하나인 망을 생각하자. 의 어떤 입력에서도, 어떤 출력에서도 각 까지 가는 경로는 하나뿐이다. 그래서 의 입력은 어느 출력과도 연결할 수 있고, 연결이 어느 을 지나는지만 정하면 경로 전체가 하나로 정해진다.
안의 에는 부터 까지 번호를 붙인다. 번호가 인 은 다음과 같이 정한다. 를 이진법으로 이라고 쓰자. 이 비트열은 의 입력에서 번호가 인 까지 내려가는 경로를 나타낸다. 각 에 대해 이면 경로는 을 이루는 두 중 첫 번째로 내려가고, 이면 두 번째로 내려간다. 의 어느 입력에서 시작하든 이 경로는 같은 에 도착하며, 그 의 번호가 다.
여러 연결이 동시에 필요할 때가 있다. 간섭을 막기 위해 모든 ()의 입력과 출력은 각각 많아야 한 연결만 쓸 수 있다. 연결 요청이 주어질 때, 어떤 두 경로도 같은 교환기의 입력이나 출력을 함께 쓰지 않도록 모든 요청의 경로를 정하라.
입력
첫 줄에 테스트 케이스의 수를 나타내는 양의 정수가 주어진다. 이 값은 이하다. 이어서 각 테스트 케이스가 다음 형식으로 주어진다.
- 한 줄에 두 정수 ()과 (). 은 가장 바깥 교환기의 층이고, 은 연결 요청의 수다.
- 다음 개 줄 중 번째 줄에 두 정수 와 (). 의 입력 를 출력 에 연결하라는 요청이다. 는 서로 다르고, 도 서로 다르다.
출력
각 테스트 케이스마다 한 줄에 정수 개 을 출력한다. 는 입력 와 출력 를 잇는 연결이 지나가는 의 번호다. 개의 경로는 서로 겹치지 않아야 하고, 그런 배정은 항상 하나 이상 존재한다.
유효한 배정은 보통 여러 개이므로, 다음과 같이 정한 표준 배정을 출력한다. 바깥 층부터 안쪽으로 한 층씩 정한다. 층 에서 각 요청은 자신을 담고 있는 를 이루는 두 중 하나로 들어간다. 그 층의 선택을 비트열 으로 적는데, 첫 번째 로 들어가면 , 두 번째로 들어가면 이다. 즉 는 의 번 비트다. 유효한 배정 전체에서 시작해, 층 의 비트열이 사전순으로 가장 작은 배정만 남긴다. 그중에서 층 의 비트열이 사전순으로 가장 작은 것만 남기고, 같은 방법을 층 까지 이어간다. 마지막에는 배정이 정확히 하나 남는다.
힌트
의 번호는 그 자체가 경로를 알려준다. 이고 번호가 인 이라면 비트가 이므로, 경로는 안의 두 번째 로, 그 안의 첫 번째 로, 그 안의 두 번째 으로 내려간다.