-
알고리즘 - MSTCS/알고리즘 2021. 2. 15. 22:21
MST
MST
-
Minimum Spanning Trees. 최소 신장 트리.
-
조건: 싸이클이 없는 무향 연결 그래프. 연결 그래프란 모든 정점 간에 경로가 존재하는 그래프를 말한다.
-
간선의 합이 최소인 신장트리를 말한다.
Prim Algorithmn
-
임의의 시작 노드를 골라 min heap에 insert한 후 노드와 연결된 노드를 min heap에 insert해준다. 거리가 작은 노드부터 꺼내며 꺼낼 때마다 연결된 노드를 찾아 min heap에 넣어주는 과정을 반복한다.
- min heap에 저장되는 정보는 현재 노드 정보와 이전 노드에서 현재 노드까지의 거리 정보이다.
- 수행시간: O(ElogV)
- 구현 with JAVA (백준 1197 최소 스패닝 트리)
1234567891011121314151617public static void prim() {PriorityQueue<Node> q = new PriorityQueue<>();q.offer(new Node(1, 0)); //1번 노드부터 시작.while(!q.isEmpty()) {Node current = q.poll(); //큐에서 cost가 가장 작은 노드를 꺼낸다.if(visited[current.node] == false) visited[current.node] = true;else continue; //이미 방문한 노드는 무시한다.min += current.cost;for(int i = 0; i < list[current.node].size(); i++) {Node next = list[current.node].get(i);if(visited[next.node] == false) q.offer(next);}}}cs Kruskal Algorithmn
-
모든 연결 노드의 정보와 거리 정보를 min heap에 저장한 후 순서대로 싸이클을 형성하지 않는 노드를 선택한다.
-
min heap에 저장되는 정보는 연결되어 있는 두 노드와 그 노드의 거리 정보이다.
- union-find를 사용해 싸이클을 검사한다.
- find(합집합 찾기): 현재 노드가 속한 집합의 부모 노드를 찾는다.
- union(합집합): 두 집합을 합친다. 즉 두 집합의 부모를 같은 부모로 설정한다.
-
수행시간: O(ElogV)
-
구현 with JAVA (백준 1197 최소 스패닝 트리)
12345678910111213141516171819202122232425262728public static void kruskal() {for(int i = 1; i < v + 1; i++) {parent[i] = i; //부모를 나 자신으로 초기화.}//pq는 간선에 대한 정보를 모두 담고있으며 cost순으로 오름차순 되어있는 우선순위큐.while(!pq.isEmpty()) {Node2 node = pq.poll();//s와 e의 각각의 부모를 찾는다int p1 = find(node.s);int p2 = find(node.e);if(p1 != p2) { //서로의 부모가 다르다면 싸이클이 없으므로 연결해 준다.union(p1, p2);min += node.cost;}}}public static int find(int a) {if(parent[a] == a) return a;else return parent[a] = find(parent[a]);}public static void union(int a, int b) {parent[a] = b;}cs reference
'CS > 알고리즘' 카테고리의 다른 글
알고리즘 - 피보나치 구현 방식 (0) 2021.03.02 알고리즘 - Shortest Path (0) 2021.02.16 알고리즘 - 위상정렬 (0) 2021.02.14 알고리즘 - 정렬 (0) 2021.02.13 알고리즘 - DFS, BFS (0) 2021.02.12 -