Amenable
Amenable's Blog
Amenable
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (189)
    • ๐Ÿ“‚ JAVA (87)
      • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” (65)
      • ์ฃผ์š” ๊ฐœ๋… (22)
    • ๐Ÿ“‚ ๊ฐœ๋ฐœ ์„œ์  (22)
      • ์‹ค์šฉ์ฃผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ (1)
      • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด (2)
      • ํด๋ฆฐ ์ฝ”๋“œ (8)
      • ํ•จ๊ป˜ ์ž๋ผ๊ธฐ (1)
      • ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” HTTP&Network Basic (10)
    • ๐Ÿ“‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (8)
      • ๊ฐœ๋… (8)
      • ๋ฌธ์ œํ’€์ด (0)
    • ๐Ÿ“‚ ๋„คํŠธ์›Œํฌ (14)
      • ๊ฐœ๋… (6)
      • ์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” 1%์˜ ๋„คํŠธ์›Œํฌ ์›๋ฆฌ (8)
    • ๐Ÿ“‚ ์Šคํ”„๋ง (13)
      • ๊ธฐ๋ณธ ๊ฐœ๋… (13)
    • ๐Ÿ“‚ WEB (5)
    • ๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ (12)
      • ๊ฐœ๋… (2)
      • ์ •๋ ฌ (8)
      • ํŠธ๋ฆฌ (2)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (10)
      • ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ (2)
      • ์ตœ๋‹จ ๊ฒฝ๋กœ (2)
      • ๋ฌธ์ž์—ด (2)
      • ETC (4)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜_๋ฌธ์ œํ’€์ด (4)
      • BOJ_๋ฐฑ์ค€ (4)
    • ๐Ÿ“‚ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (3)
    • ๐Ÿ“‚ DevOps (2)
      • ๋ฐฐํฌ (2)
    • ๐Ÿ“‚ ํ›„๊ธฐ (8)
      • ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค(ํ”„๋ฆฌ์ฝ”์Šค) (4)
      • 2023๋…„ (3)
      • 2024๋…„ (1)
    • ๐Ÿ“‚ ํšŒ๊ณ  (1)
      • 2023๋…„ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿš€ GitHub

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
Amenable

Amenable's Blog

KRUSKAL ์•Œ๊ณ ๋ฆฌ์ฆ˜
๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜/์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ

KRUSKAL ์•Œ๊ณ ๋ฆฌ์ฆ˜

2023. 3. 1. 16:19

1. ๊ธฐ๋ณธ ๊ฐœ๋… ๐Ÿงช

1. ์‹ ์žฅ ํŠธ๋ฆฌ (Spanning Tree)

  n๊ฐœ์˜ ์ •์ ์„ ๊ฐ€์ง€๋Š” ๊ทธ๋ž˜ํ”„์—์„œ n๊ฐœ์˜ ์ •์ ์„ ๋ชจ๋‘ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” n-1๊ฐœ์˜ ๊ฐ„์„ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํŠธ๋ฆฌ

(๊ฐ„์„ ์€ n-1๊ฐœ ์ด์ƒ์ผ ์ˆ˜ ์žˆ๋‹ค.)

๋ฌผ๋ก  n-1๊ฐœ ์ด์ƒ์˜ ๊ฐ„์„ ์„ ๊ฐ€์ ธ๋„ ์‹ ์žฅ ํŠธ๋ฆฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

2. ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ(Minimum Spanning Tree)

๋ฌดํ–ฅ ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ€์ค‘์น˜์˜ ํ•ฉ์ด ๊ฐ€์žฅ ์ž‘์€ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.

 

2. KRUSKAL ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๐Ÿงซ

1. ๊ธฐ๋ณธ๊ฐœ๋…

  ๊ทธ๋ฆฌ๋”” ๋ฐฉ์‹์„ ์ด์šฉํ•˜์—ฌ ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ์ฐพ๋Š” ๋ฐฉ์‹
  ๊ทธ๋ฆฌ๋””ํ•œ ๋ฐฉ์‹ ์ž์ฒด๊ฐ€ ํ•ญ์ƒ ์ตœ์ ์˜ ํ•ด๋‹ต์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์ง€๋งŒ, KRUSKAL ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š” ์ตœ์ ์˜ ํ•ด๋‹ต์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ฆ๋ช…๋˜์–ด์žˆ๋‹ค.

2. ๋™์ž‘ ๋ฐฉ์‹

  1. ๋ชจ๋“  ๊ฐ„์„ ๋“ค์„ ๊ฐ€์ค‘์น˜์— ๋”ฐ๋ผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.
  2. ๊ฐ€์ค‘์น˜๊ฐ€ ๋‚ฎ์€ ๊ฐ„์„ ๋“ค์„ ์„ ํƒํ•˜์—ฌ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค.
    ์ด๋•Œ, ์‚ฌ์ดํด์„ ๋งŒ๋“œ๋Š” ๊ฐ„์„ ์€ ์ œ์™ธํ•œ๋‹ค.
    ์‚ฌ์ดํด์˜ ์ƒ์„ฑ ์—ฌ๋ถ€๋Š” 'union-find ์•Œ๊ณ ๋ฆฌ์ฆ˜'์˜ ๊ฐœ๋…์„ ํ™œ์šฉํ•œ๋‹ค.
  3. ๋ชจ๋“  ์ •์ ์„ ํฌํ•จ('์ •์  - 1'๊ฐœ์˜ ๊ฐ„์„ ์„ ์„ ํƒํ•œ ๊ฒฝ์šฐ) ํ•  ๋•Œ๊นŒ์ง€ 2๋ฒˆ์„ ์ง„ํ–‰ํ•œ๋‹ค.

 

3. ๊ตฌํ˜„ (JAVA) ๐Ÿงฌ

  ์œ„์˜ ์˜ˆ์‹œ๋ฅผ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋กœ ์ƒ๊ฐํ•˜์ž.

  ๋จผ์ € ์ •์ ์˜ ๊ฐœ์ˆ˜(vertexNum)์™€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜(edgeNum)๋ฅผ ๋ฐ›์•„์˜จ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋งŒํผ ๊ฐ„์„ ์˜ ์ •๋ณด(์ถœ๋ฐœ์ง€, ๋„์ฐฉ์ง€, ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜)๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. 'a, b, c, d, e, f, g'๋Š” '0, 1, 2, 3, 4, 5, 6'์ด๋ผ๊ณ  ํ•˜์ž.

  ์•„๋ž˜๋Š” ์ž…๋ ฅ ์ •๋ณด์™€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋‹ค.

7 9
0 1 29
1 2 16
2 3 12
3 4 22
4 5 27
5 0 10
6 1 15
6 3 18
6 4 25
public class Main {

	static int vertexNum, edgeNum;
	static Edge[] edges;
	static int[] parents;
	
	static class Edge implements Comparable<Edge> {
		
		public int from;
		public int to;
		public int weight;
		
		public Edge(int from, int to, int weight) {
			super();
			this.from = from;
			this.to = to;
			this.weight = weight;
		}

		@Override
		public int compareTo(Edge o) {
			return Integer.compare(this.weight, o.weight);
		}
	}
	
	static void makeSet() {
		
		parents = new int[vertexNum];
		
		for(int i = 0; i < vertexNum; i++) {
			parents[i] = i;
		}
	}
	
	static int findSet(int a) {
		
		if(parents[a] == a) {
			return a;
		}
		else {
			return parents[a] = findSet(parents[a]);   
		}
	}
	
	static boolean union(int a, int b) {
		int aRoot = findSet(a);
		int bRoot = findSet(b);
		
		if(aRoot == bRoot) {
			return false;
		}
		
		parents[aRoot] = bRoot;
		return true;
	}
	
	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(in.readLine(), " ");
		vertexNum = Integer.parseInt(st.nextToken());
		edgeNum = Integer.parseInt(st.nextToken());
		
		edges = new Edge[edgeNum];
		for(int i = 0; i < edgeNum; i++) {
			st = new StringTokenizer(in.readLine(), " ");
			edges[i] = new Edge(Integer.parseInt(st.nextToken()) // ์ถœ๋ฐœ edge
						, Integer.parseInt(st.nextToken()) // ๋„์ฐฉ edge
						, Integer.parseInt(st.nextToken())); // ๊ฐ€์ค‘์น˜
		}
		
		// 1. ๊ฐ„์„ ๋“ค์„ ๊ฐ€์ค‘์น˜์— ๋”ฐ๋ผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.
		Arrays.sort(edges);
		
		makeSet();
		
		int mstWeight = 0;
		int edgeCount = 0;
		
		// 2. ๊ฐ€์ค‘์น˜๊ฐ€ ๋‚ฎ์€ ๊ฐ„์„ ์„ ๋จผ์ € ์„ ํƒํ•˜์—ฌ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๋‚˜๊ฐ„๋‹ค.
		for(Edge edge : edges) {
			if(union(edge.from, edge.to)) { // ์‚ฌ์ดํด์„ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
				mstWeight += edge.weight;
				
				// 3. ๋ชจ๋“  ์ •์ ์„ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ ('์ •์  - 1'์˜ ๊ฐ„์„ ์„ ์„ ํƒํ•œ ๊ฒฝ์šฐ)์— ๋น ์ ธ๋‚˜์˜จ๋‹ค.
				if(++edgeCount == vertexNum - 1) { 
					break;
				}
			}
		}
		
		System.out.println(mstWeight);
	}
}

 

4. ์‹œ๊ฐ„๋ณต์žก๋„ ๐Ÿ”ฌ

  KRUSKAL ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๊ฐ„์„ ๋“ค์„ ๊ฐ€์ค‘์น˜์— ๋”ฐ๋ผ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณ ๋ คํ•˜์˜€์„ ๋•Œ, KRUSKAL์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N logN)์ด๋‹ค.
  ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ฐ„์„ ์ด ๋งŽ์€ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋ฐฉ์‹(PRIM ์•Œ๊ณ ๋ฆฌ์ฆ˜)์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

 

'๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ > ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

PRIM ์•Œ๊ณ ๋ฆฌ์ฆ˜  (0) 2023.03.01
    '๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜/์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • PRIM ์•Œ๊ณ ๋ฆฌ์ฆ˜
    Amenable
    Amenable
    CS, ์ž๋ฐ”, ์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์Šคํ”„๋ง, ์Šคํ”„๋ง ๋ถ€ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”