일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 나누어 떨어지는 숫자 배열 java
- 프로그래머스 가운데 글자 가져오기 python
- m1 docker install
- 가운데 글자 가져오기 java
- 가운데 글자 가져오기 파이썬
- 최소 스패닝 트리 자바
- codeup 1020 java
- 청년 AI Big Data 아카데미 13기
- 프로그래머스 나누어 떨어지는 숫자 배열 자바
- docker 삭제
- m1 docker
- 코드업 1020 java
- 빅분기실기
- 프로그래머스 가운데 글자 가져오기 파이썬
- 코드업 1020 자바
- docker 완전 삭제
- 청년 Ai Big Data 아카데미
- 나누어 떨어지는 숫자 배열 python
- 트리의 지름 자바
- docker remove
- 트리의 지름 java
- 최소 스패닝 트리
- 핸즈온 머신러닝
- 가운데 글자 가져오기 자바
- 빅데이터분석기사
- 최단 경로 알고리즘
- 프로그래머스 가운데 글자 가져오기 자바
- 프로그래머스 나누어 떨어지는 숫자 배열 파이썬
- 가운데 글자 가져오기 python
- codeup 1020 자바
- Today
- Total
NineTwo meet you
[알고리즘] 최소 스패닝 트리 : 프림 (Prim) 본문
프림 (Prim)
- 가중치의 합이 가장 작은 트리를 찾는 최소 스패닝 트리를 푸는 알고리즘 중 하나
- 하나의 시작점으로 구성된 트리에 간선을 하나씩 추가하는 방식
동작 과정
1.
그래프를 확인하고 출발 노드를 우선순위 큐에 저장한다. (start, 0)
이때 저장되는 가중치는 자기 자신이므로 0이다.
우선순위 큐 : (0, 0)
2.
우선순위 큐를 poll 했을 때 나온 노드와 이어진 노드를 가중치를 오름차순으로 정렬하는 우선순위 큐에 저장한다.
이때 한번 지나갔던 정점은 추가하지 않는다.
우선순위 큐 : (2, 1), (1, 5)
3.
우선순위 큐를 poll 했을 때 나온 노드와 이어진 노드를 가중치를 오름차순으로 정렬하는 우선순위 큐에 저장한다.
이때 한번 지나갔던 정점은 추가하지 않는다.
우선순위 큐 : (3, 2), (1, 5)
4.
우선순위 큐를 poll 했을 때 나온 노드와 이어진 노드를 가중치를 오름차순으로 정렬하는 우선순위 큐에 저장한다.
이때 한번 지나갔던 정점은 추가하지 않는다.
우선순위 큐 : (1, 1), (6, 3), (1, 5), (4, 5)
5.
우선순위 큐를 poll 했을 때 나온 노드와 이어진 노드를 가중치를 오름차순으로 정렬하는 우선순위 큐에 저장한다.
이때 한번 지나갔던 정점은 추가하지 않는다.
우선순위 큐 : (5, 3), (6, 3), (6, 3), (1, 5), (4, 5)
6.
우선순위 큐를 poll 했을 때 나온 노드와 이어진 노드를 가중치를 오름차순으로 정렬하는 우선순위 큐에 저장한다.
이때 한번 지나갔던 정점은 추가하지 않는다.
우선순위 큐 : (6, 2), (6, 3), (6, 3), (1, 5), (4, 5)
7.
우선순위 큐를 poll 했을 때 나온 노드와 이어진 노드를 가중치를 오름차순으로 정렬하는 우선순위 큐에 저장한다.
이때 한번 지나갔던 정점은 추가하지 않는다.
우선순위 큐 : (6, 3), (6, 3), (1, 5), (4, 5)
8.
우선순위 큐를 poll 했을 때 나온 노드가 이미 지나간 정점이라면 pass 한다.
우선순위 큐 : (6, 3), (6, 3), (1, 5), (4, 5)
우선순위 큐 : (6, 3), (1, 5), (4, 5)
우선순위 큐 : (1, 5), (4, 5)
우선순위 큐 : (4, 5)
9.
우선순위 큐를 poll 했을 때 나온 노드와 이어진 노드를 가중치를 오름차순으로 정렬하는 우선순위 큐에 저장한다.
이때 한번 지나갔던 정점은 추가하지 않는다.
우선순위 큐 :
static int n; // 정점의 개수
static boolean visited[] = new boolean[n];
static int count = 0;
static ArrayList<edge>[] graph = new ArrayList[n]; // 간선 입력
for(int i = 0; i < n; i++) {
graph[i] = new ArrayList<>();
}
static void prim() {
pq.add(new edge(0,0));
while(!pq.isEmpty()) {
edge cur = pq.poll();
if(visited[cur.node]) { // 방문했던 정점 pass
continue;
}
visited[cur.node] = true;
result += cur.weight;
for(edge next : graph[cur.node]) {
if(!visited[next.node]) {
pq.offer(next);
}
}
if(++count == n) { // 정점의 개수만큼 방문
break;
}
}
}
static class edge implements Comparable<edge>{
int node;
int weight;
edge(int node, int weight){
this.node = node;
this.weight = weight;
}
// 가중치 오름차순으로 정렬
@Override
public int compareTo(edge o) {
return this.weight - o.weight;
}
}
'CS > 알고리즘' 카테고리의 다른 글
[알고리즘] 비트 마스크 bitmask (0) | 2021.02.10 |
---|---|
[알고리즘] 최대 공약수 & 최소 공배수 (0) | 2021.01.27 |
[알고리즘] 최소 스패닝 트리 : 크루스칼 (Kruskal) (0) | 2021.01.24 |
[알고리즘] 최단 경로 알고리즘 : 플로이드 와샬 (Floyd Warshall) (0) | 2021.01.20 |
[알고리즘] 최단 경로 알고리즘 : 벨만 포드 (Bellman-Ford) (0) | 2021.01.20 |