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

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

추이 폐포

면접 대비

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

요약
정점 2500개, 간선 10000개 이하의 방향 그래프에서 X에서 Y로 가는 경로가 존재하는 서로 다른 정점 쌍 (X, Y)의 개수를 센다.
난이도

보통10점 중 6점

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

문제

방향 그래프 G=(V,E)G = (V, E)가 주어진다. GG의 추이 폐포(transitive closure) 는 원소가 00 또는 11인 ∣V∣×∣V∣|V| \times |V| 크기의 행렬 RR로 나타낼 수 있다. 두 정점 AA, BB에 대해 AA에서 BB로 가는 경로가 존재하면 RR의 AA행 BB열 값을 11로, 존재하지 않으면 00으로 채운다.

행렬 RR 자체는 매우 커질 수 있으므로, 서로 다른 두 정점 X≠YX \ne Y에 대해 XX에서 YY로 가는 경로가 존재하는 순서쌍 (X,Y)(X, Y)의 개수만 출력한다. 즉, 행렬 RR에서 행과 열이 서로 다른(행 ≠\ne 열) 칸 중 값이 11인 칸의 개수를 구하는 것이다.

경로는 간선을 한 개 이상 지나야 하며, 자기 자신으로 돌아오는 경우(X=YX = Y)는 세지 않는다.

입력

첫 줄에 테스트 케이스의 개수 TT (T≤10T \le 10)가 주어진다.

각 테스트 케이스의 첫 줄에는 정점의 수 NN과 간선의 수 MM이 주어진다 (2≤N≤2,5002 \le N \le 2{,}500, 1≤M≤10,0001 \le M \le 10{,}000). 이어지는 MM개의 줄에는 각각 두 정수 AA, BB (1≤A,B≤N1 \le A, B \le N)가 주어지며, 이는 AA에서 BB로 가는 방향 간선이 존재함을 뜻한다. 같은 간선이 두 번 이상 주어지지는 않는다.

출력

각 테스트 케이스마다 X≠YX \ne Y이면서 XX에서 YY로 가는 경로가 존재하는 순서쌍 (X,Y)(X, Y)의 개수를 한 줄에 출력한다.

힌트

첫 번째 테스트 케이스의 첫 번째 그래프(N=3N = 3, 간선 1→21 \to 2와 2→32 \to 3)에서, GG의 추이 폐포 행렬 RR은 다음과 같다.

0 1 1
0 0 1
0 0 0

이 행렬에서 행과 열이 서로 다른(행 ≠\ne 열) 칸 중 값이 11인 칸은 33개이므로 답은 33이다.

예제3

  1. 예제 1

    입력
    2
    3 2
    1 2
    2 3
    4 4
    1 2
    2 3
    2 4
    4 1
    
    예상 출력
    3
    9
    
  2. 예제 2

    입력
    1
    2 1
    1 2
    
    예상 출력
    1
    
  3. 예제 3

    입력
    1
    3 3
    1 2
    2 3
    3 1
    
    예상 출력
    6