본문 바로가기
알고리즘/그래프

[java 백준] 골드 4/ 1197번 최소스패닝 트리

by Meaning_ 2022. 7. 10.
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
반응형

댓글