Algorithm

[BOJ_6497]์ „๋ ฅ๋‚œ (๊ณจ๋“œ 4) - JAVA

์ด์ˆ˜๋ฐˆ 2023. 12. 8. 20:00


๐Ÿพ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • MST
  • ๋ถ„๋ฆฌ์ง‘ํ•ฉ ( ์„œ๋กœ์†Œ ์ง‘ํ•ฉ)
  • Union - find

 


๐Ÿพ ์ƒ๊ฐ ํฌ์ธํŠธ

  • ๋งˆ์ง€๋ง‰ ๋‹ต์„ ๋„์ถœํ•  ๋•Œ total cost์—์„œ ์ตœ์†Œ ๋น„์šฉ์„ ๋นผ์ค˜์•ผ ์ ˆ์•ฝํ•œ ์ตœ๋Œ€๋น„์šฉ์ด ์ถœ๋ ฅ๋œ๋‹ค.
  • ๋‚œ ์ฒ˜์Œ์— ์ตœ๋Œ€๋น„์šฉ์„ ์ถœ๋ ฅํ•˜๋ผ๊ณ  ํ•ด์„œ ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ๋Š” ๋ฐ˜๋Œ€๋กœ ๊ฐ„์„ ์„ ์ •๋ ฌํ•  ๋•Œ ๊ฐ€์ค‘์น˜๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ–ˆ๋”๋‹ˆ ์˜ค๋‹ต์ด ๋„์ถœ๋˜์—ˆ๋‹ค. ์ž˜ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ, ์ตœ์†Œ๋น„์šฉ์„ ์ „์ฒด์—์„œ ๋นผ์ค˜์•ผ ํ•œ๋‹ค.

 


๐Ÿพ ์†Œ์Šค์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

public class Main_6497 {
	static int[] parent;

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;

		out: while (true) {
			st = new StringTokenizer(br.readLine());// ์ง‘์˜ ์ˆ˜ (์ •์ )
			int m = Integer.parseInt(st.nextToken());// ๊ธธ์˜ ์ˆ˜(๊ฐ„์„ )
			int n = Integer.parseInt(st.nextToken());
			if (n == 0 && m == 0) {
				break out;
			}
			
			int[][] edges = new int[n][3];
			
			int total = 0;
			for (int i = 0; i < n; i++) {
				st = new StringTokenizer(br.readLine());
				edges[i][0] = Integer.parseInt(st.nextToken()); // from
				edges[i][1] = Integer.parseInt(st.nextToken()); // to
				edges[i][2] = Integer.parseInt(st.nextToken()); // ๊ฐ€์ค‘์น˜
				total += edges[i][2];
			}

			Arrays.sort(edges, new Comparator<int[]>() {

				@Override
				public int compare(int[] o1, int[] o2) {
					return o1[2] - o2[2];
				}

			});

//			for (int[] e : edges) {
//				System.out.println("๋‚ด๋ฆผ์ฐจ์ˆœ : " + Arrays.toString(e));
//			}

			parent = new int[m+1];
			for (int i = 1; i < m+1; i++) {
				parent[i] = i;
			}

			int ans = 0;
			int pick = 0;

			for (int i = 0; i < n; i++) {
				int x = edges[i][0];
				int y = edges[i][1];

				if (findset(x) != findset(y)) {
					union(x, y);

					ans += edges[i][2];
//					System.out.println(ans);
					pick++;
				}
				if (pick == m - 1)
					break;
			}

			System.out.println(total - ans);

		} // while

	}

	private static void union(int x, int y) {
		parent[findset(y)] = findset(x);
	}

	private static int findset(int x) {
		if (x != parent[x])
			return parent[x] = findset(parent[x]);
		return x;
	}
}

 


๐Ÿ˜ต‍๐Ÿ’ซ ๊ณต๋ถ€ํ•ด์•ผ ํ•  ์ 

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์›๋ฆฌ๋ฅผ ์ž˜ ์ƒ๊ฐํ•˜๋ฉด์„œ ํ’€์ž!
  • ๋‹จ๊ธฐ ๊ธฐ์–ต ๊ธˆ์ง€.. ๋‚ด๊ฒƒ์œผ๋กœ ๋งŒ๋“ค๊ธฐ..