Hiya_
๊ฐœ๋ฐœ์ž์ทจ๐ŸŒฑ
Hiya_
Github
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (155) N
    • ๐Ÿ’ปBackend (1) N
      • ๋ผ์ด์ง•์บ ํ”„ (6)
      • SSAFY | ์‹ธํ”ผ (2)
      • ์‹ ํ•œDS ๊ธˆ์œตSW ์•„์นด๋ฐ๋ฏธ (2)
    • ๐Ÿ“๋ฌธ์ œ ํ’€์ด (102)
      • ๐ŸงฉBaekjoon (47)
      • ๐ŸงฉProgrammers (42)
      • ๐ŸงฉSWExpertAcademy (10)
      • ๐ŸงฉSofteer (3)
    • ๐Ÿ“‚Language (31)
      • Python (3)
      • JAVA (2)
      • SQL (6)
      • English (19)
    • โœจUseful information (5)
    • ๐Ÿ”‘Algorithms (3)
    • ๐Ÿ™Git (2)

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

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ํ† ์ต์ ์ˆ˜
  • ์ •๋ ฌ
  • UNION ALL
  • greedy algorithm
  • ํ•ด์ปค์ŠคํŒŒ๋žญ์ด
  • ๋ฐฑ์ค€
  • 2์ฐจ์› ๋ฐฐ์—ด
  • ํ† ์ต๋…ํ•™
  • Union
  • ํ•ด์ปค์Šคํ† ์ต
  • ํ‹ฐ์Šคํ† ๋ฆฌ์ฑŒ๋ฆฐ์ง€
  • ๊ตฌํ˜„
  • ๊ทธ๋ฆฌ๋””
  • ํ† ์ต๋ฌด๋ฃŒ๊ฐ•์˜
  • ํ† ์ต๊ณต๋ถ€
  • mysql
  • ์˜ค๋ธ”์™„
  • ์™„์ „ํƒ์ƒ‰
  • Python
  • BaekJoon
  • ํ† ์ต์‹œํ—˜
  • ํ† ์ตRC
  • ์ฝ”ํ…Œ
  • ๋‚ด์žฅํ•จ์ˆ˜
  • ๋ฆฌ์ŠคํŠธ
  • ํ† ์ต๊ธฐ์ถœ
  • ํ† ์ต๋ฌด๋ฃŒ์ž๋ฃŒ
  • ๋‹ค์ต์ŠคํŠธ๋ผ
  • sort
  • BFS

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ


Owner : ๊น€์‹ ์˜
Naver Blog

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

๊ฐœ๋ฐœ์ž์ทจ๐ŸŒฑ

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ | ํฌ๋ฃจ์Šค์นผ/ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
๐Ÿ”‘Algorithms

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ | ํฌ๋ฃจ์Šค์นผ/ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

2023. 5. 29. 17:30
~๋ชฉ์ฐจ~

์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๋ž€?

ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜


 

(์ตœ์†Œ) ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๋ž€?

 ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ค๋ช…ํ•˜๊ธฐ ์ด์ „์— ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ(Spanning Tree)๋ž€ ๋ฌด์—‡์ธ๊ฐ€ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๋Š” ์–ด๋–ค ๊ทธ๋ž˜ํ”„์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉฐ ์‚ฌ์ดํด์ด ์—†๋Š” ๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค

 

๊ทธ๋ฆผ์œผ๋กœ ์ดํ•ดํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค

์™ผ์ชฝ๊ณผ ๊ฐ™์€ ์ดˆ๊ธฐ ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ์„ ๋•Œ ์˜ค๋ฅธ์ชฝ ๊ทธ๋ž˜ํ”„๋Š” ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์•„๋ž˜ ๊ทธ๋ž˜ํ”„๋Š” ์ŠคํŒจํŒ… ํŠธ๋ฆฌ ์ผ๊นŒ์š”?

์•„๋‹™๋‹ˆ๋‹ค. ์˜ค๋ฅธ์ชฝ ๊ทธ๋ž˜ํ”„๋Š” ์‚ฌ์ดํด์ด ๋ฐœ์ƒํ–ˆ๊ณ , ์˜ค๋ฅธ์ชฝ ๊ทธ๋ž˜ํ”„๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์•„๋ž˜ ๊ทธ๋ž˜ํ”„๋Š” ์‹ ์žฅ(์ŠคํŒจ๋‹) ํŠธ๋ฆฌ์ผ๊นŒ์š”?

๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์‹ ์žฅ ํŠธ๋ฆฌ ์ค‘ ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค.

 

์ตœ์†Œ ์‹ ์žฅ(์ŠคํŒจ๋‹) ํŠธ๋ฆฌ๋Š” ์‹ ์žฅ ํŠธ๋ฆฌ ์ค‘ ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์„ ๊ฐ–๋Š” ๊ทธ๋ž˜ํ”„์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋Š” '(๋…ธ๋“œ ๊ฐœ์ˆ˜) - 1' ์ž…๋‹ˆ๋‹ค

์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ

 

์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ํฌ๋ฃจ์Šค์นผ(kruskal) ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ”„๋ฆผ(prim) ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ์Šต๋‹ˆ๋‹ค

๋‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋Š” ๊ฐ„์„  ์ค‘ ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์„ ๊ฐ–๋Š” ๊ฐ„์„ ๋ถ€ํ„ฐ ์—ฐ๊ฒฐํ•ด ๋‚˜๊ฐ€๋ฏ€๋กœ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์†ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

 

ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ | Kruskal

๊ทธ๋ ‡๋‹ค๋ฉด ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

๊ทธ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ธ ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋‚จ์•„ ์žˆ๋Š” ๊ฐ„์„  ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ„์„ ๋ถ€ํ„ฐ ์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ์—ฐ๊ฒฐํ•ด ๋‚˜๊ฐ‘๋‹ˆ๋‹ค.

๊ฐ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ์ง‘ํ•ฉ์— ์†ํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์„œ๋กœ์†Œ ์ง‘ํ•ฉ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„ ์ฝ”๋“œ

import sys
input = sys.stdin.readline # ์ž…๋ ฅ ์†๋„ ํ–ฅ์ƒ์„ ์œ„ํ•œ ์ฒ˜๋ฆฌ

parent = [i for i in range(V+1)]  # ๊ฐ ๋…ธ๋“œ๊ฐ€ ์–ด๋–ค ์ง‘ํ•ฉ์— ์†ํ•ด์žˆ๋Š”์ง€ ์ •๋ณด
result = 0

def find_parent(x):  # x๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ์–ด๋–ค ์ง‘ํ•ฉ์— ์†ํ–ˆ๋Š”์ง€ ๋ฐ˜ํ™˜
    if parent[x] != x:
        parent[x] = find_parent(parent[x])  # ์ง‘ํ•ฉ ๋…ธ๋“œ ์—…๋ฐ์ดํŠธ
    return parent[x]

def union_parent(a, b):  
    a = find_parent(a)  # a์˜ ์ง‘ํ•ฉ
    b = find_parent(b)  # b์˜ ์ง‘ํ•ฉ
    if a < b:  # ์ž‘์€ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋กœ ํ†ตํ•ฉ
        parent[b] = a
    else:
        parent[a] = b

V, E = map(int, input().split())  # ๋…ธ๋“œ ์ˆ˜, ๊ฐ„์„  ์ˆ˜ 
edges = []  # ๊ฐ„์„  ์ •๋ณด ์ €์žฅํ•  ๋ฆฌ์ŠคํŠธ

for i in range(E):
    a, b, w = map(int, input().split())
    edges.append((w, a, b))  # (๋น„์šฉ, ๋…ธ๋“œa, ๋…ธ๋“œb)

edges.sort()  # ๋น„์šฉ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ

for w, a, b in edges:  # ์ž‘์€ ๊ฐ„์„ ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ
    if find_parent(a) != find_parent(b):  # ์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด
        union_parent(a, b)  # ์ง‘ํ•ฉ ํ†ตํ•ฉ
        result += w  # ๊ฐ„์„  ๋น„์šฉ ๊ณ„์‚ฐ

print(result)

 

 

๋ฌธ์ œ ํ’€์ด

2023.05.23 - [๐Ÿ“๋ฌธ์ œ ํ’€์ด/๐ŸงฉBaekjoon] - [Python] ๋ฐฑ์ค€ 1197 ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ

2023.05.28 - [๐Ÿ“๋ฌธ์ œ ํ’€์ด/๐ŸงฉBaekjoon] - [Python] ๋ฐฑ์ค€ 1922 ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ | ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

2023.05.29 - [๐Ÿ“๋ฌธ์ œ ํ’€์ด/๐ŸงฉBaekjoon] - [Python] ๋ฐฑ์ค€ 14621 ๋‚˜๋งŒ ์•ˆ๋˜๋Š” ์—ฐ์•  | ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

 

 

 

 

ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ | Prim

์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ์— ๋…ธ๋“œ๊ฐ€ ํฌํ•จ๋๋Š”์ง€ ์—ฌ๋ถ€๋Š” set ์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค

 

์™ผ์ชฝ ์œ„๋ถ€ํ„ฐ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ๋ณด๋ฉด

 

1. ์‹œ์ž‘ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๊ฐ„์„ ์„ ์ตœ์†Œํž™์œผ๋กœ ์ƒ์„ฑ & ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐ

2. ์ตœ์†Œ ๋น„์šฉ์„ ๊ฐ–๋Š” ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜์—ฌ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์—ฐ๊ฒฐ & ํ•ด๋‹น ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๊ฐ„์„  ํž™์— ์‚ฝ์ž…

3. 2 ๋ฐ˜๋ณต

 

 

 

ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ณธ ๊ตฌํ˜„ ์ฝ”๋“œ

import sys
import heapq
input = sys.stdin.readline
INF = int(1e9)

n, m = map(int, input().split())
connected = set()  # ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ์— ์†ํ•œ ๋…ธ๋“œ
graph = [[] for _ in range(n+1)]  # ๊ฐ ๋…ธ๋“œ๋ณ„ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค
startNode = (INF, 0)  # (๊ธธ์ด, ๋…ธ๋“œ)
result = 0

for _ in range(m):  # ๊ฐ„์„ 
    a, b, w = map(int, input().split())
    # ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ด๋ฏ€๋กœ ๋‘ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ๋ชจ๋‘ ์—ฐ๊ฒฐ
    graph[a].append((w, b))
    graph[b].append((w, a))
    startNode = (w, a) if startNode[0] > w else startNode  # ๊ฐ€์žฅ ์ž‘์€ ๊ฐ„์„ ์„ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ

q = graph[startNode[1]]
heapq.heapify(q)  # ์‹œ์ž‘ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ๋“ค ์ตœ์†Œ ํž™ ๋ณ€๊ฒฝ

connected.add(startNode[1])  # ์‹œ์ž‘ ๋…ธ๋“œ ์—ฐ๊ฒฐ

while q:
    w, b = heapq.heappop(q)  # ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ฐ„์„  ์ค‘ ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ
    if b not in connected:  # ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด
        connected.add(b)  # ๋…ธ๋“œ ์—ฐ๊ฒฐ
        result += w  # ๊ฐ„์„  ๋น„์šฉ ๊ณ„์‚ฐ
        
        for w2, a2 in graph[b]:  # ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๊ฐ„์„ ๋“ค
            if a2 not in connected:  # ์ด๋ฏธ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด
                heapq.heappush(q, (w2, a2))  # ์ตœ์†Œ ํž™์— ์‚ฝ์ž…

print(result)

 

 

 

 

 

 

 

๋„์›€์ด ๋˜์…จ๋‹ค๋ฉด ์ข‹์•„์š” ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”๐Ÿ’š

 


REFERENCE

<์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค with Python> ์„œ์ 

https://velog.io/@syc1013/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%B5%9C%EC%86%8C%EC%8B%A0%EC%9E%A5%ED%8A%B8%EB%A6%AC-Minimum-Spanning-Trees#prim-algorithm

 

 

'๐Ÿ”‘Algorithms' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ | ๋‹ค์ต์ŠคํŠธ๋ผ | ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ  (0) 2023.05.17
[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์‹œ๊ฐ„๋ณต์žก๋„ ๊ตฌํ•˜๊ธฐ  (0) 2023.04.04
    '๐Ÿ”‘Algorithms' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ | ๋‹ค์ต์ŠคํŠธ๋ผ | ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ
    • [์•Œ๊ณ ๋ฆฌ์ฆ˜] ์‹œ๊ฐ„๋ณต์žก๋„ ๊ตฌํ•˜๊ธฐ
    Hiya_
    Hiya_
    ํ•˜์–€ ์ฒœ๊ณผ ๋ฐ”๋žŒ๋งŒ ์žˆ๋‹ค๋ฉด ์–ด๋””๋“  ๊ฐˆ ์ˆ˜ ์žˆ์–ด

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