만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

위상 정렬

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

요약
정점이 최대 20개인 방향 비순환 그래프에서 모든 정점 쌍 (i, j)마다 j가 i보다 앞에 오는 위상 정렬의 개수를 구합니다.
난이도

보통10점 중 7점

유형
동적 계획법, 비트 연산, 위상 정렬
정답자
아직 제출이 없습니다

문제

방향 비순환 그래프(DAG)의 위상 정렬은 정점들의 순열 p1,…,pnp_1, \ldots, p_n으로, 모든 간선에 대해 시작 정점이 도착 정점보다 순열에서 앞에 오는 것이다.

방향 비순환 그래프가 주어진다. 각 정점 쌍 (u,v)(u, v)에 대해, 정점 uu가 정점 vv보다 앞에 오는 위상 정렬의 개수를 구하라.

입력

첫 줄에 테스트 케이스의 개수 tt가 주어진다. 이어서 각 테스트 케이스가 주어진다.

각 테스트 케이스의 첫 줄에는 정점의 개수 nn과 간선의 개수 mm이 주어진다(1≤n≤201 \le n \le 20, 0≤m≤n(n−1)/20 \le m \le n(n-1)/2). 다음 mm개의 줄에는 정점 uiu_i에서 정점 viv_i로 가는 간선을 나타내는 두 정수 uiu_i, viv_i가 주어진다(1≤ui<vi≤n1 \le u_i < v_i \le n).

테스트 케이스는 최대 100개이다. 그중 최대 5개의 테스트 케이스에서 n>10n > 10이다.

출력

각 테스트 케이스마다 nn개의 수로 이루어진 nn개의 줄을 출력한다. ii번째 줄의 jj번째 수는 정점 jj가 정점 ii보다 앞에 오는 위상 정렬의 개수와 같다. i=ji = j이면 0이다.

예제1

  1. 예제 1

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