알고리즘/백준

[BOJ] 1197 - 최소 스패닝 트리 (Java)

DeveloperJason 2023. 8. 23. 09:43

접근법

가장 기본적인 최소 신장 트리

간선의 정보를 가중치 기준 오름차순 정렬한 뒤 사이클이 돌지 않는 선에서 선들을 이어준다.

  • 추가
  • V-1만큼을 이어주면 탈출하는 조건을 넣는다면 좀 더 시간이 빨라질 것 같다. ⇒ 미묘한 성능 향상

코드

package boj;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

public class BOJ_1197_최소_스패닝_트리 {
	static int[] parent;
	static int sum = 0;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		int V = Integer.parseInt(st.nextToken());
		int E = Integer.parseInt(st.nextToken());

		parent = new int[V + 1];
		for (int i = 1; i <= V; i++) {
			parent[i] = i;
		}
		ArrayList<int[]> v = new ArrayList<>();

		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());
			v.add(new int[] { A, B, C });

		}

		Collections.sort(v, (o1, o2) -> o1[2] - o2[2]);

		for (int i = 0; i < E; i++) {
			int[] tmp = v.get(i);
			if (find_root(tmp[0]) == find_root(tmp[1])) {
				continue;
			} else {
				merge(tmp[0], tmp[1]);
				sum += tmp[2];
			}

		}
		System.out.println(sum);

	}

	static int find_root(int node) {
		if (node == parent[node])
			return node;

		return parent[node] = find_root(parent[node]);
	}

	static void merge(int n1, int n2) {
		parent[find_root(n1)] = find_root(n2);
	}

}

결과

메모리  시간  언어
50408KB 648ms Java