시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 1024 MB | 117 | 36 | 31 | 35.227% |
정휘는 알고리즘 강의에서 그래프의 최소 신장 트리를 구하는 알고리즘인 크루스칼 알고리즘에 대해 배웠다. 크루스칼 알고리즘은 다음과 같이 동작한다.
연결 무향 가중치 그래프가 주어졌을 때 알고리즘이 최소 신장 트리를 구한다는 것은 어렵지 않게 증명할 수 있다.
정휘는 (1)에서 가중치가 같은 간선을 정렬하는 기준이 없다는 점이 마음에 들지 않는다. 같은 그래프가 주어져도 다른 결과가 나올 수 있다는 것은 용납할 수 없는 일이다. 정휘는 자신의 분노를 수치화하기 위해 얼마나 다양한 결과가 나올 수 있을지 계산하려고 했지만, 알고리즘 강의가 끝날 때까지 그 방법을 찾지 못해서 여러분에게 문제로 내기로 했다.
$N$개의 정점과 $M$개의 간선으로 구성된 단순 연결 무향 가중치 그래프가 주어진다. 크루스칼 알고리즘을 이용해 최소 신장 트리를 구할 때, $F$에 간선을 추가하는 방법의 수를 구하는 프로그램을 작성해 보자. $F$에 추가된 간선들의 집합이 다르거나, 간선들을 추가하는 순서가 다르다면 다른 방법으로 센다.
첫째 줄에 정점의 개수 $N$과 간선의 개수 $M$이 공백으로 구분되어 주어진다.
둘째 줄부터 $M$개의 줄에 걸쳐 두 간선이 연결하는 정점 번호 $u_i, v_i$와 간선의 가중치 $w_i$가 주어진다.
$F$에 간선을 추가하는 순서로 가능한 경우의 수를 $998\,244\,353(= 119 \times 2^{23} + 1)$으로 나눈 나머지를 출력한다.
5 4 1 2 1 1 3 1 1 4 1 1 5 1
24
5 4 1 2 1 1 3 2 1 4 3 1 5 4
1
3 3 1 2 1 1 3 1 2 3 1
6
Contest > BOJ User Contest > Good Bye, BOJ > Good Bye, BOJ 2022! G번