[Algorithm] ๐ŸŒ†๋ฐฑ์ค€ 1647 ๋„์‹œ ๋ถ„ํ•  ๊ณ„ํš

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

Algorithm

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

0. ๋ฌธ์ œ

๋™๋ฌผ์›์—์„œ ๋ง‰ ํƒˆ์ถœํ•œ ์›์ˆญ์ด ํ•œ ๋งˆ๋ฆฌ๊ฐ€ ์„ธ์ƒ๊ตฌ๊ฒฝ์„ ํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ํ‰ํ™”๋กœ์šด ๋งˆ์„์— ๊ฐ€๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ๊ทธ๊ณณ์—์„œ๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ์ผ์ด ๋ฒŒ์–ด์ง€๊ณ  ์žˆ์—ˆ๋‹ค.

๋งˆ์„์€ N๊ฐœ์˜ ์ง‘๊ณผ ๊ทธ ์ง‘๋“ค์„ ์—ฐ๊ฒฐํ•˜๋Š” M๊ฐœ์˜ ๊ธธ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๊ธธ์€ ์–ด๋Š ๋ฐฉํ–ฅ์œผ๋กœ๋“ ์ง€ ๋‹ค๋‹ ์ˆ˜ ์žˆ๋Š” ํŽธ๋ฆฌํ•œ ๊ธธ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ๊ธธ๋งˆ๋‹ค ๊ธธ์„ ์œ ์ง€ํ•˜๋Š”๋ฐ ๋“œ๋Š” ์œ ์ง€๋น„๊ฐ€ ์žˆ๋‹ค.

๋งˆ์„์˜ ์ด์žฅ์€ ๋งˆ์„์„ ๋‘ ๊ฐœ์˜ ๋ถ„๋ฆฌ๋œ ๋งˆ์„๋กœ ๋ถ„ํ• ํ•  ๊ณ„ํš์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋งˆ์„์ด ๋„ˆ๋ฌด ์ปค์„œ ํ˜ผ์ž์„œ๋Š” ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋งˆ์„์„ ๋ถ„ํ• ํ•  ๋•Œ๋Š” ๊ฐ ๋ถ„๋ฆฌ๋œ ๋งˆ์„ ์•ˆ์— ์ง‘๋“ค์ด ์„œ๋กœ ์—ฐ๊ฒฐ๋˜๋„๋ก ๋ถ„ํ• ํ•ด์•ผ ํ•œ๋‹ค. ๊ฐ ๋ถ„๋ฆฌ๋œ ๋งˆ์„ ์•ˆ์— ์žˆ๋Š” ์ž„์˜์˜ ๋‘ ์ง‘ ์‚ฌ์ด์— ๊ฒฝ๋กœ๊ฐ€ ํ•ญ์ƒ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ๋งˆ์„์—๋Š” ์ง‘์ด ํ•˜๋‚˜ ์ด์ƒ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๋งˆ์„์˜ ์ด์žฅ์€ ๊ณ„ํš์„ ์„ธ์šฐ๋‹ค๊ฐ€ ๋งˆ์„ ์•ˆ์— ๊ธธ์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ผ๋‹จ ๋ถ„๋ฆฌ๋œ ๋‘ ๋งˆ์„ ์‚ฌ์ด์— ์žˆ๋Š” ๊ธธ๋“ค์€ ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์—†์•จ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ๋ถ„๋ฆฌ๋œ ๋งˆ์„ ์•ˆ์—์„œ๋„ ์ž„์˜์˜ ๋‘ ์ง‘ ์‚ฌ์ด์— ๊ฒฝ๋กœ๊ฐ€ ํ•ญ์ƒ ์กด์žฌํ•˜๊ฒŒ ํ•˜๋ฉด์„œ ๊ธธ์„ ๋” ์—†์•จ ์ˆ˜ ์žˆ๋‹ค. ๋งˆ์„์˜ ์ด์žฅ์€ ์œ„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋„๋ก ๊ธธ๋“ค์„ ๋ชจ๋‘ ์—†์• ๊ณ  ๋‚˜๋จธ์ง€ ๊ธธ์˜ ์œ ์ง€๋น„์˜ ํ•ฉ์„ ์ตœ์†Œ๋กœ ํ•˜๊ณ  ์‹ถ๋‹ค. ์ด๊ฒƒ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ
์ฒซ์งธ ์ค„์— ์ง‘์˜ ๊ฐœ์ˆ˜N, ๊ธธ์˜ ๊ฐœ์ˆ˜M์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 2์ด์ƒ 100,000์ดํ•˜์ธ ์ •์ˆ˜์ด๊ณ , M์€ 1์ด์ƒ 1,000,000์ดํ•˜์ธ ์ •์ˆ˜์ด๋‹ค. ๊ทธ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ M์ค„์— ๊ฑธ์ณ ๊ธธ์˜ ์ •๋ณด๊ฐ€ A B C ์„ธ ๊ฐœ์˜ ์ •์ˆ˜๋กœ ์ฃผ์–ด์ง€๋Š”๋ฐ A๋ฒˆ ์ง‘๊ณผ B๋ฒˆ ์ง‘์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ธธ์˜ ์œ ์ง€๋น„๊ฐ€ C (1 โ‰ค C โ‰ค 1,000)๋ผ๋Š” ๋œป์ด๋‹ค.

์ถœ๋ ฅ
์ฒซ์งธ ์ค„์— ์—†์• ๊ณ  ๋‚จ์€ ๊ธธ ์œ ์ง€๋น„์˜ ํ•ฉ์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

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

๐Ÿ’กMST ๊ตฌํ•˜๋Š” ๋ฐฉ์‹์ด๋ž‘ ๊ฐ™์Œ
๐Ÿ’ก๋ชจ๋“  ์ •์ ์ด ์ด์–ด์ง„ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์ง„ ํ•œ ๊ฐ„์„ ์„ ๋Š์œผ๋ฉด ๋„์‹œ๊ฐ€ ๋ถ„ํ• ๋จ

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

1) ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ MST ๊ตฌํ•˜๊ธฐ

while(!pq.isEmpty()) {
	Edge e = pq.poll();
			
	if(find(e.start) == find(e.end))
		continue;
	else {
		union(e.start, e.end);
		count += e.cost;
	}
}
...
static int find(int e){
...
}
...
static int union(int a, int b){
...
}
...

2) ๊ทธ ์ค‘ ๊ฐ€์ค‘์น˜๊ฐ€ ๊ฐ€์žฅ ํฐ ๊ฐ„์„  ๋Š์–ด๋‚ด๊ธฐ

...
max = Math.max(max, e.cost);
...
System.out.pritnln(count-max);

3. ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.io.IOException;
public class Graph_5 {
	static int[] parent;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] s = br.readLine().split(" ");
		
		int N = Integer.parseInt(s[0]);
		int M = Integer.parseInt(s[1]);
		int count = 0;
		int max = -1;
		parent = new int[N+1];
		
		PriorityQueue<Edge> pq = new PriorityQueue<>();
		
		for(int i=1; i<N+1; i++)
			parent[i] = i;
		
		for(int i=0; i<M; i++) {
			s = br.readLine().split(" ");
			int start = Integer.parseInt(s[0]);
			int end = Integer.parseInt(s[1]);
			int cost = Integer.parseInt(s[2]);
			pq.add(new Edge(start,end,cost));
		}
		
		while(!pq.isEmpty()) {
			Edge e = pq.poll();
			
			if(find(e.start) == find(e.end))
				continue;
			else {
				union(e.start, e.end);
				count += e.cost;
				max = Math.max(max, e.cost);
			}
		}
		
		System.out.println(count-max);
		
	}
	
	static int find(int e) {
		if(e == parent[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๊ฐœ์˜ ๋Œ“๊ธ€