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

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

Rikka with Linker

시간 제한2초메모리 제한512 MB

요약
n개 라이브러리의 의존 관계 그래프가 주어질 때, 모든 간선 (a,b)에 대해 a가 b보다 앞에 오는 쌍이 존재하도록 하는 가장 짧은 라이브러리 이름 나열의 길이를 구한다.
난이도

어려움10점 중 8점

유형
비트 연산, 동적 계획법, 그래프, 그리디
정답자
아직 제출이 없습니다

문제

커맨드 라인에서 C++ 프로젝트를 컴파일해 본 적이 있다면 링커에 익숙할 것이다. 두 정적 라이브러리 liba.a와 libb.a를 사용하는데 liba.a가 libb.a에 의존한다면, 커맨드에서 liba.a를 libb.a보다 앞에 두어야 한다. 예를 들어 "g++ -o my my.cpp liba.a libb.a"처럼 쓴다.

liba.a와 libb.a가 서로 의존한다면 어떻게 될까? "g++ -o my my.cpp liba.a libb.a liba.a"처럼 두 이름을 커맨드에 여러 번 넣어야 한다. 형식적으로, 두 라이브러리 liba.a와 libb.a를 사용하는데 liba.a가 libb.a에 의존한다면, 커맨드에서 어떤 libb.a보다 앞에 오는 liba.a가 적어도 하나 있어야 한다.

이제 Rikka는 자신의 C++ 프로젝트를 진행 중이고, 사용할 정적 라이브러리가 nn개 있다. 의존 관계는 mm쌍이다. 쌍 (i,j)(i, j)는 ii번째 라이브러리가 jj번째 라이브러리에 의존한다는 뜻이다.

복잡한 커맨드는 행복을 가져다주지 않는다. 그래서 Rikka는 컴파일 커맨드를 단순하게 만들고 싶다. 구체적으로, 컴파일 커맨드에 들어가는 정적 라이브러리 이름의 개수를 가능한 한 작게 만들고 싶다. 이 개수를 구해 주자.

입력

첫 번째 줄에 정수 tt (1≤t≤1031 \leq t \leq 10^3)가 주어진다. 이는 테스트 케이스의 수이다.

각 테스트 케이스의 첫 번째 줄에 두 정수 nn과 mm (1≤n≤181 \leq n \leq 18, 0≤m≤n⋅(n−1)0 \leq m \leq n \cdot (n-1))이 주어진다.

이어서 mm개의 줄이 주어지고, 각 줄에 두 정수 aa와 bb (1≤a,b≤n1 \leq a, b \leq n, a≠ba \neq b)가 주어지며 의존 관계를 나타낸다. 라이브러리 aa가 라이브러리 bb에 의존한다는 뜻이다.

각 의존 관계는 최대 한 번만 주어지며, n>12n > 12인 테스트 케이스는 최대 2020개이다.

출력

각 테스트 케이스마다 Rikka의 컴파일 커맨드에 들어가는 라이브러리 이름 개수의 최솟값을 한 줄에 하나씩 출력한다.

예제1

  1. 예제 1

    입력
    3
    3 2
    1 2
    2 3
    3 3
    1 2
    2 3
    3 1
    5 7
    1 2
    2 3
    3 5
    5 4
    4 2
    2 5
    3 1
    
    예상 출력
    3
    4
    6