최소신장트리 문제로 Kruskal, Prim 알고리즘을 써서 해결해야하는 문제였다. 주어진 값들의 범위가 커 인접행렬 대신 인접 리스트를 구성했다.
참고자료 없이도 Kruskal, Prim 알고리즘을 구현할 수 있도록 암기가 필요할 듯하다.(ㅠㅠ)
1. Kruskal 알고리즘 이용
먼저 크루스칼은 Edge
클래스를 만들어서 가능한 모든 간선을 PriorityQueue
에 저장한다. (방향 없는 그래프이므로 내부 for문을 i+1부터 시작해서 중복을 없앤다.)
그리고 비용이 가장 작은 간선부터 Union-Find
기법으로 사이클이 만들어지지 않도록 간선을 선택한다. 간선을 선택하는 개념이므로 cnt == N-1
이면 종료한다.
2. Prim 알고리즘 이용
kruskal보다 짧지만 더 복잡했던거 같다. kruskal에서는 Edge 클래스를 만들었지만 Prim은 Node
클래스를 사용한다.
그리고 LinkedList[] list
를 사용해 모든 간선을 넣어준다. 여기서는 연결되어진 두 노드에서 서로에게 갈 수 있도록 같은 간선이어도 중복해서 넣어준다.
위와 마찬가지로 PriorityQueue
를 이용하는데 0번 노드부터 시작하도록 Node(0,0)
을 초기값으로 준다.
그리고 방문체크를 하면서 방문한 노드들과 연결된 노드들의 비용이 작은 것 부터 선택한다. 노드를 선택하는 개념이므로 cnt == N
이면 종료한다.