스패닝 트리가 K개인 가장 작은 그래프
시간 제한5초메모리 제한512 MB
이동과 부착 연산으로 만든 그래프의 생성 트리 수가 K가 될 때, 노드 수의 최솟값을 구한다. K는 10000 이하이다.
문제
무방향 그래프의 스패닝 트리는 그래프의 간선만 사용하면서 모든 정점을 포함하는 트리이고, 간선 수는 정점 수보다 1 작다. 사용한 간선 집합이 다르면 서로 다른 스패닝 트리로 센다.
스패닝 트리가 정확히 개인 그래프를 정점을 최대한 적게 써서 만들려고 한다. 단, 아래 과정으로 만든 그래프만 인정한다.
정점이 하나뿐인 그래프에서 시작한다. 이 정점이 중심 이면서 끝점 이다. 여기에 다음 두 연산을 원하는 순서로 원하는 횟수만큼 적용한다.
- 옮기기: 중심을 현재 끝점으로 바꾼다. 즉 로 두고, 정점과 간선은 늘지 않는다.
- 잇기: 양의 정수 와 를 고른다. 와 가 같은 정점이면 이어야 한다. 새 정점 을 만들고 간선 를 추가한다. 그 다음 로 둔다.
잇기는 끝점에서 출발해 중심으로 돌아오는 새 경로를 붙이고, 그 경로 위의 번째 새 정점을 다음 끝점으로 삼는 연산이다. 이 과정으로 만든 그래프에는 자기 자신으로 가는 간선이 없고, 같은 두 정점을 잇는 간선이 두 개 이상 생기지도 않는다.
이 과정으로 만들 수 있으면서 스패닝 트리가 정확히 개인 그래프의 최소 정점 수를 구하라.
입력
첫 줄에 테스트 케이스의 개수 가 주어진다. 이어지는 개의 줄에 정수 가 한 줄에 하나씩 주어진다.
출력
각 테스트 케이스마다 Case #x: y 형식으로 한 줄씩 출력한다. 는 1부터 시작하는 테스트 케이스 번호이고, 는 최소 정점 수이다.
주어진 범위의 모든 에 답이 존재하고, 그 값은 항상 22 이하이다.
설명
첫 잇기에서는 와 가 같은 정점이므로 길이 인 사이클이 생긴다. 사이클의 스패닝 트리 개수는 간선 수와 같으므로 개다. 이면 삼각형 하나로 충분하고 답은 3이다.
이면 먼저 , 로 삼각형을 만든 뒤, , 로 잇기를 한 번 더 적용한다. 정점 4개와 간선 5개짜리 그래프가 되고 스패닝 트리는 8개다.
옮기기를 적용하면 그 뒤에 붙는 부분이 앞서 만든 부분과 정점 하나만 공유한다. 이때 전체 스패닝 트리 개수는 두 부분의 스패닝 트리 개수의 곱이다. 정점 하나를 공유하는 삼각형 두 개는 정점이 5개이고 스패닝 트리가 9개다.