크루스칼 알고리즘
시간 제한2초메모리 제한1024 MB
크루스칼 알고리즘으로 최소 신장 트리를 만들 때 가능한 간선 추가 순서와 집합의 경우의 수를 998244353으로 나눈 나머지를 구한다.
문제
정휘는 알고리즘 강의에서 그래프의 최소 신장 트리를 구하는 알고리즘인 크루스칼 알고리즘에 대해 배웠다. 크루스칼 알고리즘은 다음과 같이 동작한다.
- 간선을 가중치 오름차순으로 정렬한다. 이때 두 간선의 가중치가 동일하다면 두 간선 중 어떠한 것이 앞에 와도 상관없다.
- 최소 신장 트리를 이루는 간선의 집합 를 공집합으로 초기화한다. ()
- 간선을 차례대로 보면서, 만약 간선 의 양 끝점이 의 간선들을 통해 연결되어 있지 않다면 를 에 추가한다. 즉, 에 사이클이 없다면 에 를 추가한다.
연결 무향 가중치 그래프가 주어졌을 때 알고리즘이 최소 신장 트리를 구한다는 것은 어렵지 않게 증명할 수 있다.
정휘는 (1)에서 가중치가 같은 간선을 정렬하는 기준이 없다는 점이 마음에 들지 않는다. 같은 그래프가 주어져도 다른 결과가 나올 수 있다는 것은 용납할 수 없는 일이다. 정휘는 자신의 분노를 수치화하기 위해 얼마나 다양한 결과가 나올 수 있을지 계산하려고 했지만, 알고리즘 강의가 끝날 때까지 그 방법을 찾지 못해서 여러분에게 문제로 내기로 했다.
개의 정점과 개의 간선으로 구성된 단순 연결 무향 가중치 그래프가 주어진다. 크루스칼 알고리즘을 이용해 최소 신장 트리를 구할 때, 에 간선을 추가하는 방법의 수를 구하는 프로그램을 작성해 보자. 에 추가된 간선들의 집합이 다르거나, 간선들을 추가하는 순서가 다르다면 다른 방법으로 센다.
입력
첫째 줄에 정점의 개수 과 간선의 개수 이 공백으로 구분되어 주어진다.
둘째 줄부터 개의 줄에 걸쳐 두 간선이 연결하는 정점 번호 와 간선의 가중치 가 주어진다.
출력
에 간선을 추가하는 순서로 가능한 경우의 수를 으로 나눈 나머지를 출력한다.
제한
- 이면
- 모든 정점은 간선을 통해 서로 직/간접적으로 연결되어 있다.