추이 폐포
면접 대비시간 제한1초메모리 제한128 MB
정점 2500개, 간선 10000개 이하의 방향 그래프에서 X에서 Y로 가는 경로가 존재하는 서로 다른 정점 쌍 (X, Y)의 개수를 센다.
문제
방향 그래프 가 주어진다. 의 추이 폐포(transitive closure) 는 원소가 또는 인 크기의 행렬 로 나타낼 수 있다. 두 정점 , 에 대해 에서 로 가는 경로가 존재하면 의 행 열 값을 로, 존재하지 않으면 으로 채운다.
행렬 자체는 매우 커질 수 있으므로, 서로 다른 두 정점 에 대해 에서 로 가는 경로가 존재하는 순서쌍 의 개수만 출력한다. 즉, 행렬 에서 행과 열이 서로 다른(행 열) 칸 중 값이 인 칸의 개수를 구하는 것이다.
경로는 간선을 한 개 이상 지나야 하며, 자기 자신으로 돌아오는 경우()는 세지 않는다.
입력
첫 줄에 테스트 케이스의 개수 ()가 주어진다.
각 테스트 케이스의 첫 줄에는 정점의 수 과 간선의 수 이 주어진다 (, ). 이어지는 개의 줄에는 각각 두 정수 , ()가 주어지며, 이는 에서 로 가는 방향 간선이 존재함을 뜻한다. 같은 간선이 두 번 이상 주어지지는 않는다.
출력
각 테스트 케이스마다 이면서 에서 로 가는 경로가 존재하는 순서쌍 의 개수를 한 줄에 출력한다.
힌트
첫 번째 테스트 케이스의 첫 번째 그래프(, 간선 와 )에서, 의 추이 폐포 행렬 은 다음과 같다.
0 1 1
0 0 1
0 0 0
이 행렬에서 행과 열이 서로 다른(행 열) 칸 중 값이 인 칸은 개이므로 답은 이다.