๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[๋ฐฑ์ค€ ์Šคํ„ฐ๋”” 12์ฃผ์ฐจ] 1647๋ฒˆ ๋„์‹œ๋ถ„ํ• ๊ณ„ํš ๊ณจ๋“œ4 - ์ž๋ฐ”(JAVA)/ ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ(MST)/ ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๐Ÿ“‘ ๋ฌธ์ œ

https://www.acmicpc.net/problem/1647

 

1647๋ฒˆ: ๋„์‹œ ๋ถ„ํ•  ๊ณ„ํš

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

www.acmicpc.net

๋”๋ณด๊ธฐ
๋”๋ณด๊ธฐ

๋ฌธ์ œ

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

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

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

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

์ž…๋ ฅ

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

์ถœ๋ ฅ

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

 

 

 

 

 

 

 

 

โœ’๏ธ ํ’€์ด

 ์ด ๋ฌธ์ œ์˜ KeyPoint๋Š” ์ตœ์†Œ๋น„์šฉ์„ ์œ ์ง€ํ•˜๋ฉฐ ๋งˆ์„์„ ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 ๋ฐ”๋กœ >> ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ์—์„œ ์ตœ๋Œ€ ๊ฐ€์ค‘์น˜์ธ ๊ฐ„์„  ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐ <<ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. 

 ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ(MST)๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋ฉด ์ด๋ฏธ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค. ์ด๋•Œ ์ตœ๋Œ€๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ„์„  ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด, ํ•œ ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ๋–จ์–ด์ ธ๋‚˜๊ฐ€๋“ , ๊ทธ ์ด์ƒ์˜ ๋ฌถ์Œ์ด ๋–จ์–ด์ ธ๋‚˜๊ฐ€๋“  ๋ชจ๋“  ๋…ธ๋“œ๋“ค์€ ์—ฌ์ „ํžˆ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ์ฑ„๋กœ ๋‘ ๊ฐœ๋กœ ๋‚˜๋‰˜๊ฒŒ ๋œ๋‹ค.

 ๋‚˜๋Š” "ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜"์„ ์‚ฌ์šฉํ–ˆ๊ณ , ์ด๋ฅผ ์œ„ํ•ด find()/union()ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ์ƒ์„ฑํ–ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ํฌ๋ฃจ์Šค์นผ์˜ ํ…œํ”Œ๋ฆฟ์ฒ˜๋Ÿผ ์“ฐ์ด๋ฏ€๋กœ ๊ทธ๋ƒฅ ํ†ต์งธ๋กœ ์™ธ์šฐ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

 

 

 

 

 

 

 

 

๐Ÿ’ป ์†Œ์Šค์ฝ”๋“œ: ์ž๋ฐ”(Java)

/**
 * ๋ชจ๋“  ๋งˆ์„์˜ ์ง‘๋“ค์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๊ณ ,
 * ๊ทธ ์—ฐ๊ฒฐ๋น„์šฉ์€ ์ตœ์†Œ์ธ ์ƒํƒœ๋กœ ๋‘ ๊ฐœ๋กœ ๋ถ„ํ• ํ•˜๊ธฐ
 * => MST์—์„œ ์ตœ๋Œ€๋น„์šฉ ๊ฐ„์„  ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋‘ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋‰œ๋‹ค.
*/
public class Main_๋ฐฑ์ค€_1647_๋„์‹œ๋ถ„ํ• ๊ณ„ํš_๊ณจ๋“œIV {

	static int N, M;
	static PriorityQueue<int[]> queue;
	static int[] parents;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		queue = new PriorityQueue<>((a,b)->(a[0]-b[0]));//๊ฐ€์ค‘์น˜ ์šฐ์„ ์ˆœ์œ„
		parents = new int[N+1];
		
		for (int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine());
			int v1 = Integer.parseInt(st.nextToken());
			int v2 = Integer.parseInt(st.nextToken());
			int w = Integer.parseInt(st.nextToken());
			queue.offer(new int[] {w, v1, v2});
		}//input
		
		for (int i = 1; i <= N; i++) {
			parents[i] = i;
		}//make
		
		System.out.println(kruskal());
	}//end of main
	
	private static int kruskal() {
		int result = 0;
		int max = Integer.MIN_VALUE;
		while(queue.size()>0) {
			int[] edge = queue.poll();
			int w = edge[0];
			int v1 = edge[1];
			int v2 = edge[2];
			if(union(v1,v2)) {
				result+=w;
				max = Math.max(max, w);
			}
		}
		return result-max;
	}//kruskal
	
	private static int find(int v) {
		if(parents[v]==v) return v;
		return parents[v]=find(parents[v]);
	}//find
	
	private static boolean union(int v1, int v2) {
		int root1 = find(v1);
		int root2 = find(v2);
		
		if(root1==root2) return false;
		parents[root1] = root2;
		return true;
	}//union
}//end of class

 

 

 

 

 

 

 

 

 

 

๐Ÿ’Ž ๐Ÿ’Ž ๐Ÿ’Ž

 

 

๏ผฐ๏ฝ๏ฝ“๏ฝ”๏ฝ…๏ฝ„ ๏ผข๏ฝ™ ๏ผณ๏ผก๏ผน

๐˜›๐˜ฉ๐˜ข๐˜ฏ๐˜ฌ๐˜ด ๐˜ง๐˜ฐ๐˜ณ ๐˜ณ๐˜ฆ๐˜ข๐˜ฅ๐˜ช๐˜ฏ๐˜จ