우리의 보물을 지켜라!
시간 제한1초메모리 제한128 MB
각 해적이 가진 열쇠 집합이 주어질 때, 모든 자물쇠를 함께 열 수 있으면서 불필요한 구성원이 없는 최소 그룹을 크기순과 사전순으로 모두 출력한다.
문제
명의 해적이 보물을 상자에 넣었다. 해적들은 (그럴 만한 이유로!) 서로를 믿지 못해 자물쇠 장인을 찾아간다. 장인은 상자에 개의 자물쇠를 채우는데, 상자를 열려면 모든 자물쇠를 풀어야 한다. 그런 다음 각 해적이 열쇠를 일부는 갖되 전부는 갖지 못하도록 열쇠를 나눠 준다. 하나의 자물쇠에 대응하는 열쇠는 여러 개일 수 있지만, 하나의 열쇠는 오직 하나의 자물쇠만 열 수 있다.
해적의 수와 각 해적이 가진 열쇠 집합이 주어질 때, 함께 상자를 열 수 있으면서 불필요한 구성원이 하나도 없는 모든 해적 무리를 찾아라. 즉, 무리에서 어떤 해적이라도 빠지면 더 이상 상자를 열 수 없어야 한다.
해적의 수가 너무 많아 가능한 모든 조합을 단순히 살펴볼 수는 없으므로, 더 영리한 알고리즘을 골라야 한다.
입력
첫째 줄에 해적의 수 과 자물쇠의 수 이 주어진다. 이어지는 개의 줄 중 번째 줄에는 번 해적이 열쇠를 가진 자물쇠들의 번호가 공백으로 구분되어 주어진다. 해적의 번호는 부터 까지이고, 자물쇠의 번호는 부터 까지이다.
출력
상자를 열 수 있으면서 불필요한 구성원이 없는 모든 해적 무리를 출력한다. 각 무리는 한 줄에 출력하며, 무리에 속한 해적의 번호를 오름차순으로 나열한다. 무리는 구성원 수가 적은 것부터 많은 것 순으로 나열하고, 구성원 수가 같은 무리끼리는 사전순으로 나열한다 (사전순 비교는 첫 번째 해적 번호를 먼저 비교하고, 같으면 두 번째, 그다음 세 번째 순으로 비교한다).