728x90
반응형
MST를 통해 풀어야 하는 문제다.
MST에는 크루스칼과 프림 두가지 방법이 있다. dense가 많을 때는 프림이 더 효율적이다. 10만개의 간선이 들어오므로 프림으로 풀었다.
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 | import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.StringTokenizer; public class Main1197 { static class Edge { int target; int value; Edge(int target, int value) { this.target = target; this.value = value; } } static ArrayList<Edge>[] list; static int[] direction; static boolean[] visited; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); int N = Integer.parseInt(st.nextToken()); int M = Integer.parseInt(st.nextToken()); list = new ArrayList[N]; direction = new int[N]; visited = new boolean[N]; for (int i = 0; i < N; i++) { list[i] = new ArrayList<>(); direction[i] = Integer.MAX_VALUE; } for (int i = 0; i < M; i++) { st = new StringTokenizer(br.readLine(), " "); int start = Integer.parseInt(st.nextToken())-1; int end = Integer.parseInt(st.nextToken())-1; int val = Integer.parseInt(st.nextToken()); list[start].add(new Edge(end, val)); list[end].add(new Edge(start, val)); } int start = 0; direction[start] = 0; visited[start] = true; int answer = 0; while(true) { for (int i = 0; i < list[start].size(); i++) { int target = list[start].get(i).target; int value = list[start].get(i).value; if(!visited[target]) { if(direction[target] > value) direction[target] = value; } } int min = Integer.MAX_VALUE; boolean isEnd = true; for (int i = 0; i < direction.length; i++) { if(visited[i] || direction[i] == Integer.MAX_VALUE) continue; if(direction[i] < min) { min = direction[i]; start = i; isEnd = false; } } if(isEnd) break; visited[start] = true; answer += min; } System.out.println(answer); } } | cs |
728x90
반응형
'Algorithm > 백준(BOJ)' 카테고리의 다른 글
[백준 1012] 유기농 배추 (C, DFS) (0) | 2020.01.05 |
---|---|
[백준 4963] 섬의 개수 (C) (0) | 2020.01.03 |
[백준 3425] 고스택 (Java, 시뮬레이션) (0) | 2019.07.26 |
[백준 14889] 스타트와 링크 (Java) (0) | 2019.05.09 |
[백준 17140] 이차원 배열과 연산 (Java) (3) | 2019.05.06 |