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

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

두 팀으로 나누기

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

요약
서로 아는 사람끼리만 같은 팀이 되도록 N명을 두 팀으로 나누고, 두 팀 크기 차이를 최소로 할 때의 두 크기를 출력한다.
난이도

보통10점 중 7점

유형
그래프, DFS, 동적 계획법, 완전 탐색
정답자
아직 제출이 없습니다

문제

사람들을 다음 조건을 모두 만족하도록 정확히 두 팀으로 나누세요.

  • 모든 사람은 정확히 한 팀에 속한다.
  • 각 팀에는 적어도 한 명이 있다.
  • 한 팀 안에서는 모든 사람이 같은 팀의 다른 모든 사람을 안다.
  • 두 팀의 크기 차이가 가능한 한 작다.

'안다'는 반드시 상호적이지 않습니다. 사람 aa가 사람 bb를 알아도 bb는 aa를 모를 수 있습니다. 두 사람이 같은 팀에 속하려면 양방향으로 서로를 알아야 합니다.

이렇게 두 팀으로 나누는 것이 불가능하면, 유효한 분할이 없음을 보고하세요.

입력

사람들은 11부터 NN까지 서로 다른 정수로 번호가 매겨져 있습니다.

첫 줄에는 사람 수를 나타내는 정수 NN (2≤N≤1002 \le N \le 100)이 주어집니다. 이어지는 NN개의 줄은 번호가 커지는 순서대로 각 사람을 설명합니다. 그중 ii번째 줄에는 사람 ii가 아는 사람들의 서로 다른 번호 AijA_{ij} (1≤Aij≤N1 \le A_{ij} \le N, Aij≠iA_{ij} \ne i)가 공백으로 구분되어 나열되고, 마지막에 하나의 00으로 끝납니다.

출력

유효한 분할이 존재하지 않으면 No solution을 한 줄에 출력합니다.

그렇지 않으면, 크기 차이가 가장 작은 분할의 두 팀 크기는 유일하게 정해집니다. 이 두 크기를 한 줄에 공백으로 구분하여 출력합니다. 먼저 더 작은 팀의 크기를, 그다음 더 큰 팀의 크기를 출력합니다(두 팀의 크기가 같으면 같은 값을 두 번 출력합니다).

예제2

  1. 예제 1

    입력
    5
    2 3 5 0
    1 4 5 3 0
    1 2 5 0
    1 2 3 0
    4 3 2 1 0
    
    예상 출력
    2 3
    
  2. 예제 2

    입력
    5
    3 4 5 0
    1 3 5 0
    2 1 4 5 0
    2 3 5 0
    1 2 3 4 0
    
    예상 출력
    No solution