[Algorithm] ๐Ÿ–ง๋ฐฑ์ค€ 1922 ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ

HaJingJingยท2021๋…„ 5์›” 29์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
55/119

0. ๋ฌธ์ œ

๋„ํ˜„์ด๋Š” ์ปดํ“จํ„ฐ์™€ ์ปดํ“จํ„ฐ๋ฅผ ๋ชจ๋‘ ์—ฐ๊ฒฐํ•˜๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๋ ค ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์•„์‰ฝ๊ฒŒ๋„ ํ—ˆ๋ธŒ๊ฐ€ ์žˆ์ง€ ์•Š์•„ ์ปดํ“จํ„ฐ์™€ ์ปดํ“จํ„ฐ๋ฅผ ์ง์ ‘ ์—ฐ๊ฒฐํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ชจ๋‘๊ฐ€ ์ž๋ฃŒ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“  ์ปดํ“จํ„ฐ๊ฐ€ ์—ฐ๊ฒฐ์ด ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. (a์™€ b๊ฐ€ ์—ฐ๊ฒฐ์ด ๋˜์–ด ์žˆ๋‹ค๋Š” ๋ง์€ a์—์„œ b๋กœ์˜ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. a์—์„œ b๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์„ ์ด ์žˆ๊ณ , b์™€ c๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์„ ์ด ์žˆ์œผ๋ฉด a์™€ c๋Š” ์—ฐ๊ฒฐ์ด ๋˜์–ด ์žˆ๋‹ค.)

๊ทธ๋Ÿฐ๋ฐ ์ด์™•์ด๋ฉด ์ปดํ“จํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋น„์šฉ์„ ์ตœ์†Œ๋กœ ํ•˜์—ฌ์•ผ ์ปดํ“จํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋น„์šฉ ์™ธ์— ๋‹ค๋ฅธ ๊ณณ์— ๋ˆ์„ ๋” ์“ธ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด์ œ ๊ฐ ์ปดํ“จํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋น„์šฉ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ๋ชจ๋“  ์ปดํ“จํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ๋น„์šฉ์„ ์ถœ๋ ฅํ•˜๋ผ. ๋ชจ๋“  ์ปดํ“จํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

์ž…๋ ฅ
์ฒซ์งธ ์ค„์— ์ปดํ“จํ„ฐ์˜ ์ˆ˜ N (1 โ‰ค N โ‰ค 1000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„์—๋Š” ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์„ ์˜ ์ˆ˜ M (1 โ‰ค M โ‰ค 100,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

์…‹์งธ ์ค„๋ถ€ํ„ฐ M+2๋ฒˆ์งธ ์ค„๊นŒ์ง€ ์ด M๊ฐœ์˜ ์ค„์— ๊ฐ ์ปดํ“จํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š”๋ฐ ๋“œ๋Š” ๋น„์šฉ์ด ์ฃผ์–ด์ง„๋‹ค. ์ด ๋น„์šฉ์˜ ์ •๋ณด๋Š” ์„ธ ๊ฐœ์˜ ์ •์ˆ˜๋กœ ์ฃผ์–ด์ง€๋Š”๋ฐ, ๋งŒ์•ฝ์— a b c ๊ฐ€ ์ฃผ์–ด์ ธ ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด a์ปดํ“จํ„ฐ์™€ b์ปดํ“จํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š”๋ฐ ๋น„์šฉ์ด c (1 โ‰ค c โ‰ค 10,000) ๋งŒํผ ๋“ ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. a์™€ b๋Š” ๊ฐ™์„ ์ˆ˜๋„ ์žˆ๋‹ค.

์ถœ๋ ฅ
๋ชจ๋“  ์ปดํ“จํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ๋น„์šฉ์„ ์ฒซ์งธ ์ค„์— ์ถœ๋ ฅํ•œ๋‹ค.

1. ์•„์ด๋””์–ด

๐Ÿ’ก Kruskal Algorithm ์ด์šฉ โ†’ MST ๋ฌธ์ œ
๐Ÿ’ก ์‹œ์ž‘์ ๊ณผ ๋์ ์ด ๊ฐ™์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋œ MST ๋ฌธ์ œ

2. ํ•ต์‹ฌ ํ’€์ด

1) ์‹œ์ž‘์ ๊ณผ ๋์ ์ด ๊ฐ™์œผ๋ฉด ์‚ฌ์ดํด์ด๋‹ˆ ์•„์˜ˆ ์ €์žฅํ•˜์ง€ ์•Š์Œ

for(int i=0; i<m; i++) {
	String[] s = br.readLine().split(" ");
	int start = Integer.parseInt(s[0]);
	int end = Integer.parseInt(s[1]);
	int cost = Integer.parseInt(s[2]);
			
	if(start == end)
		continue;
			
	pq.add(new Edge(start, end, cost));
}

์ดํ•˜ MST ๊ตฌํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์ฝ”๋“œ ๊ฐ™์Œ

3. ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.io.IOException;
public class Graph_8 {
	static int[] parent;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		int m = Integer.parseInt(br.readLine());
		
		parent = new int[n+1];
		for(int i=1; i<n+1; i++)
			parent[i] = i;
		
		PriorityQueue<Edge> pq = new PriorityQueue<>();
		for(int i=0; i<m; i++) {
			String[] s = br.readLine().split(" ");
			int start = Integer.parseInt(s[0]);
			int end = Integer.parseInt(s[1]);
			int cost = Integer.parseInt(s[2]);
			
			if(start == end)
				continue;
			
			pq.add(new Edge(start, end, cost));
		}
		
		int ret = 0;
		while(!pq.isEmpty()) {
			Edge e = pq.poll();
			if(find(e.start) == find(e.end))
				continue;
			else {
				union(e.start, e.end);
				ret += e.cost;
			}
		}
		
		System.out.println(ret);
	}
	
	static int find(int e) {
		if(parent[e] == e) return e;
		return parent[e] = find(parent[e]);
	}
	
	static void union(int a, int b) {
		int rootA = find(a);
		int rootB = find(b);
		
		if(rootA != rootB) parent[rootB] = rootA;
	}
	
	static class Edge implements Comparable<Edge>{
		int start;
		int end;
		int cost;
		
		Edge(int start, int end, int cost) {
			this.start = start;
			this.end = end;
			this.cost = cost;
		}
		
		@Override
		public int compareTo(Edge o) {
			return this.cost - o.cost;
		}
	}

}

4. ๊ฒฐ๊ณผ

์„ฑ๊ณตโœจ

profile
๐ŸŒฑ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€