Algorithm/๋ฐฑ์ค€

๋ฐฑ์ค€ 23743๋ฒˆ : ๋ฐฉํƒˆ์ถœ

giraffe_ 2023. 7. 26. 00:56

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

 

23743๋ฒˆ: ๋ฐฉํƒˆ์ถœ

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ๋ฐฉ์˜ ๊ฐœ์ˆ˜ $N$๊ณผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์›Œํ”„์˜ ๊ฐœ์ˆ˜ $M$์ด ์ฃผ์–ด์ง„๋‹ค. ($2 \le N \le 200\,000$, $1 \le M \le 100\,000$) ๋‹ค์Œ $M$๊ฐœ์˜ ์ค„์—๋Š” ์›Œํ”„์˜ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์„ธ ์ •์ˆ˜ $a_i$, $b_i$, $c_i$๊ฐ€ ๊ณต๋ฐฑ์œผ

www.acmicpc.net

 

 

 

 

 

๋ฌธ์ œ

  • 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€ ์ด N๊ฐœ์˜ ๋ฐฉ
  • ๊ฐ ๋ฐฉ์—๋Š” ์นœ๊ตฌ๋“ค์ด ํ•œ ๋ช…์”ฉ ๋“ค์–ด๊ฐ€ ์žˆ๊ณ , ๋ชจ๋“  ๋ฐฉ์€ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์™„์ „ํžˆ ๋…๋ฆฝ๋˜์—ˆ์Œ
  • ์›Œํ”„ : ์ตœ๋Œ€ M๊ฐœ, i๋ฒˆ์งธ ์›Œํ”„ ์„ค์น˜ํ•˜๋Š” ๋ฐ Ci ์‹œ๊ฐ„, ai๋ฒˆ๊ณผ bi๋ฒˆ ๋ฐฉ ์‚ฌ์ด ์ด๋™
  • ๋น„์ƒํƒˆ์ถœ๊ตฌ : i๋ฒˆ ๋ฐฉ์— ์„ค์น˜ํ•˜๋Š” ๋ฐ ti ์‹œ๊ฐ„
  • ๋น„์ƒํƒˆ์ถœ๊ตฌ์˜ ์„ค์น˜ ์ž‘์—…์„ ๋™์‹œ์— ์—ฌ๋Ÿฟ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†์Œ
  • ๋ชจ๋“  ์นœ๊ตฌ๋“ค์ด ์ถœ๊ตฌ๋กœ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ์›Œํ”„์™€ ๋น„์ƒํƒˆ์ถœ๊ตฌ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„ ๊ตฌํ•˜๊ธฐ

 

 

์˜ˆ์ œ ์ž…์ถœ๋ ฅ

3 3
1 2 2
2 3 2
3 1 2
3 3 3

 

๊ฒฐ๊ณผ : 7

 

 

 

 

 

 

ํ’€์ด

  • ํƒˆ์ถœ๊ตฌ๋ฅผ 0๋ฒˆ๋ฐฉ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค (ํƒˆ์ถœ๊ตฌ๋กœ ๊ฐ€๋Š” ๊ธธ๋„ ํ•˜๋‚˜์˜ ๊ฐ„์„ ์ด๋‹ค)

 

  • MST(์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ) ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜์ธ ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ–ˆ๋‹ค.
    • ๊ฐ„์„  ์ •๋ณด(์ •์ 1, ์ •์ 2, ๋น„์šฉ) ์ €์žฅ → ๋น„์šฉ ๋‚ฎ์€ ์ˆœ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
    • ๋‚ฎ์€ ๋น„์šฉ๋ถ€ํ„ฐ ์‚ฌ์ดํด์ด ์กด์žฌํ•˜์ง€ ์•Š๊ฒŒ ์„ ํƒ
    • union, find ์ˆ˜ํ–‰
      • union : ๋ถ€๋ชจ๊ฐ€ ๊ฐ™์€์ง€ ํ™•์ธ(์‚ฌ์ดํด์ธ์ง€) → ๋‹ค๋ฅด๋ฉด ๋ถ€๋ชจ ๊ฐฑ์‹ (์—ฐ๊ฒฐ)
      • find : ํ•ด๋‹น ์ •์ ์˜ ๋ถ€๋ชจ ์ฐพ๊ธฐ
    • (์ •์  ๊ฐœ์ˆ˜ - 1) ๋งŒํผ ์„ ํƒํ–ˆ์œผ๋ฉด ์ข…๋ฃŒ

 

 

 

 

์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class b23743 {
	static int N, M;
	static Edge[] edgeList;
	static int[] parents;
	
	static class Edge implements Comparable<Edge> {
		int from, to, weight;

		public Edge(int from, int to, int weight) {
			this.from = from;
			this.to = to;
			this.weight = weight;
		}

		@Override
		public int compareTo(Edge o) {
			return this.weight - o.weight;
		}
	}
	
	static void make() {
		parents = new int[N + 1];
		
		for(int i = 0; i < N + 1; i++) {
			parents[i] = i;
		}
	}
	
	static int find(int a) {
		if(parents[a] == a) return a;
		
		return parents[a] = find(parents[a]);
		
	}
	
	static boolean union(int a , int b) {
		int aRoot = find(a);
		int bRoot = find(b);
		
		if(aRoot == bRoot) return false;
		
		parents[bRoot] = aRoot;
		return true;
	}

	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()); //์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์›Œํ”„์˜ ๊ฐœ์ˆ˜
		
		edgeList = new Edge[M + N]; //๊ฐ„์„  ๋ฐฐ์—ด
		
		//์›Œํ”„ ์—ฐ๊ฒฐ
		for(int i = 0; i < M; i ++) {
			st = new StringTokenizer(br.readLine(), " ");
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			int c = Integer.parseInt(st.nextToken());
		
			edgeList[i] = new Edge(a, b, c);
		}
		
		//ํƒˆ์ถœ๊ตฌ ์„ค์น˜
		st = new StringTokenizer(br.readLine(), " ");
		for(int i = 1; i <= N; i ++) {
			int t = Integer.parseInt(st.nextToken());
			edgeList[M + i - 1] = new Edge(0, i, t); //ํƒˆ์ถœ๊ตฌ๋Š” 0
		}
		
		//์ฒ˜๋ฆฌ
		make(); //๋ถ€๋ชจ ๋…ธ๋“œ ๋งŒ๋“ค๊ธฐ
		Arrays.sort(edgeList); //์‹œ๊ฐ„ ๋‚ฎ์€ ์ˆœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
		
		//ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
		int result = 0;
		int count = 0;
		for(Edge edge : edgeList) { //๋‚ฎ์€ ๋น„์šฉ๋ถ€ํ„ฐ ์—ฐ๊ฒฐ
			if(union(edge.from, edge.to)) { //์‚ฌ์ดํด์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ„์„  ์„ ํƒ
				result += edge.weight; //๋น„์šฉ ๊ฐฑ์‹ 
				if(++count == N) break; //์ •์  ๊ฐœ์ˆ˜ - 1 ๋งŒํผ ์„ ํƒํ–ˆ์œผ๋ฉด ์ข…๋ฃŒ : N + 1(ํƒˆ์ถœ๊ตฌ ํฌํ•จ) - 1
			}
		}
		
		//์ถœ๋ ฅ
		System.out.println(result);
	}

}

 

 

 

 

 

๊ฒฐ๊ณผ

 

 

 

 

 

๋ฐฐ์šด์ 

  • ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์˜ค๋žœ๋งŒ์— ๊ณต๋ถ€ํ–ˆ๋‹ค