Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

빠르게 핵심만

[백준 1197] 최소 스패닝 트리 Java 풀이 본문

알고리즘

[백준 1197] 최소 스패닝 트리 Java 풀이

빠르게 핵심만 2023. 10. 18. 15:20
 

1197번: 최소 스패닝 트리

첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이

www.acmicpc.net

 

풀이

최소 스패닝 트리(MST)를 구하는 문제로 Kruskal 알고리즘을 사용하여 문제를 해결할 수 있습니다.

 

코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
	static int v, e;
	static int edgeCount, answer;
	static int[] parent;
	static PriorityQueue<Edge> pq = new PriorityQueue<>();

	static class Edge implements Comparable<Edge> {
		int a, b, weight;

		Edge(int a, int b, int weight) {
			this.a = a;
			this.b = b;
			this.weight = weight;
		}

		@Override
		public int compareTo(Edge o) {
			return this.weight - o.weight;
		}
	}

	static void makeSet() {
		parent = new int[v];
		for (int i = 0; i < v; i++) {
			parent[i] = i;
		}
	}

	static int find(int i) {
		if (i == parent[i]) return i;
		return parent[i] = find(parent[i]);
	}

	static boolean union(int a, int b) {
		a = find(a);
		b = find(b);
		if (a == b) return false; // 사이클이 발생하는 경우
		if (a > b) parent[a] = b;
		else parent[b] = a;
		return true;
	}

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		v = Integer.parseInt(st.nextToken());
		e = Integer.parseInt(st.nextToken());

		for (int i = 0; i < e; i++) {
			st = new StringTokenizer(br.readLine());
			int a = Integer.parseInt(st.nextToken()) - 1;
			int b = Integer.parseInt(st.nextToken()) - 1;
			int weight = Integer.parseInt(st.nextToken());
			pq.offer(new Edge(a, b, weight));
		}

		makeSet();

		// Kruskal 알고리즘을 이용하여 MST의 가중치를 구한다.
		for (int i = 0; i < e; i++) {
			Edge edge = pq.poll();
			if (union(edge.a, edge.b)) {
				answer += edge.weight;
				if (++edgeCount == v - 1) break;
			}
		}

		System.out.println(answer);
	}
}

 

 

add 1197 · jinseoplee/baekjoon-solutions@026f88f

jinseoplee committed Feb 3, 2024

github.com