728x90
반응형
https://www.acmicpc.net/problem/1197
1197번: 최소 스패닝 트리
첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이
www.acmicpc.net
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
class Main{
public static class Node implements Comparable<Node>{
int to;
int distance;
public Node(int to,int distance){
this.to=to;
this.distance=distance;
}
@Override
public int compareTo(Node other){
return this.distance-other.distance;
}
}
public static int total;
public static int v,e;
static List<Node>[] list;
static boolean[] visited;
public static void prim(int start){
PriorityQueue<Node>pq=new PriorityQueue<Node>();
pq.add(new Node(start,0));
while(!pq.isEmpty()){
Node node=pq.poll();
int to=node.to;
int distance=node.distance;
if(!visited[to]){
//인접한 노드 중 가장 가중치 작은 애를 먼저 방문(어차피 우선순위 큐이기 때문에
//가중치 작은애가 먼저 나옴)
visited[to]=true;
total+=distance;
for(Node next:list[to]){
if(!visited[next.to]){
pq.add(new Node(next.to,next.distance));
}
}
}
}
}
public static void main(String[]args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st=new StringTokenizer(br.readLine());
v=Integer.parseInt(st.nextToken());
e=Integer.parseInt(st.nextToken());
list=new ArrayList[v+1];
visited = new boolean[v+1];
for(int i=0;i<=v;i++){
list[i]=new ArrayList<Node>();
}
for(int i=0;i<e;i++){
st=new StringTokenizer(br.readLine());
int a=Integer.parseInt(st.nextToken());
int b=Integer.parseInt(st.nextToken());
int c=Integer.parseInt(st.nextToken());
list[a].add(new Node(b,c));
list[b].add(new Node(a,c));
}
prim(1);
System.out.println(total);
}
}
|
cs |
0. 최소스패닝 트리를 풀 수 있는 알고리즘 중 프림 알고리즘을 사용한다!
1. 양방향 간선이다.
2. 아무리 queue에 넣어줬어도 queue에 넣은 이후 탐색에 의해 노드의 visited여부가 달라질 수 있음 그래서 visited 두번 검사해줄 것.
https://loosie.tistory.com/159
[알고리즘/ 그래프] 최소 스패닝 트리 - 크루스칼(Kruskal)과 프림(Prim) 알고리즘 (Java)
스패닝 트리 또는 신장 트리 어떤 무향 그래프의 스패닝 트리는 원래 그래프의 정점 전부와 간선의 부분 집합으로 구성된 부분 그래프이다. 이때 스패닝 트리에 포함된 간선들은 정점들을 트리
loosie.tistory.com
728x90
반응형
'알고리즘 > 그래프' 카테고리의 다른 글
[java 백준] 20040번 사이클게임 (0) | 2022.09.09 |
---|---|
[java 백준] 1043번 거짓말 (0) | 2022.08.20 |
[java 백준] 골드 3/ 1238번 파티 (0) | 2022.07.08 |
[java 백준] 이것이 코딩테스트이다.- 화성탐사 (java) (0) | 2022.07.06 |
[java 백준] 골드 4/ 11404번 플로이드 (0) | 2022.07.06 |
댓글