Kruskal Algorithm with Python

์œ ๊ฑด์šฐยท2024๋…„ 9์›” 19์ผ

์ฝ”ํ…Œ์ค€๋น„

๋ชฉ๋ก ๋ณด๊ธฐ
10/13

๐Ÿ“– ๋ฌธ์ œ ์„ค๋ช…

๋ฌธ์ œ ๋งํฌ : https://www.acmicpc.net/problem/1197

  • ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ทธ ๊ทธ๋ž˜ํ”„์˜ ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
  • ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๋Š”, ์ฃผ์–ด์ง„ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ์ •์ ๋“ค์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„ ์ค‘์—์„œ ๊ทธ ๊ฐ€์ค‘์น˜์˜ ํ•ฉ์ด ์ตœ์†Œ์ธ ํŠธ๋ฆฌ๋ฅผ ๋งํ•œ๋‹ค.

์ž…๋ ฅ

  • ์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ V(1 โ‰ค V โ‰ค 10,000)์™€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ E(1 โ‰ค E โ‰ค 100,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ E๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์„ธ ์ •์ˆ˜ A, B, C๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด๋Š” A๋ฒˆ ์ •์ ๊ณผ B๋ฒˆ ์ •์ ์ด ๊ฐ€์ค‘์น˜ C์ธ ๊ฐ„์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. C๋Š” ์Œ์ˆ˜์ผ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ์ ˆ๋Œ“๊ฐ’์ด 1,000,000์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ทธ๋ž˜ํ”„์˜ ์ •์ ์€ 1๋ฒˆ๋ถ€ํ„ฐ V๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๊ณ , ์ž„์˜์˜ ๋‘ ์ •์  ์‚ฌ์ด์— ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋‹ค.
  • ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ -2,147,483,648๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 2,147,483,647๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

  • ์ฒซ์งธ ์ค„์— ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.





๐Ÿ’ก ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด

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




๐Ÿง‘โ€๐Ÿ’ป ์ฝ”๋“œ ํ’€์ด

find-parent

def find_parent(parent, x):
    if parent[x] != x:
        parent[x] = find_parent(parent, parent[x])
    return parent[x]
  • ๋ถ€๋ชจ๋…ธ๋“œ๋ฅผ ์ฐพ์•„์ฃผ๋Š” ๋กœ์ง์ž…๋‹ˆ๋‹ค.



union-parent

def union_parent(parent, x, y):
    a = find_parent(parent, x)
    b = find_parent(parent, y)

    if a != b:
        parent[b] = a
  • ๋ถ€๋ชจ๋…ธ๋“œ๋ฅผ ์„œ๋กœ ๋ณ‘ํ•ฉํ•ด์ฃผ๋Š” ๋กœ์ง์ž…๋‹ˆ๋‹ค.



input

parent = [i for i in range(n + 1)]
arr = []
for i in range(m):
    x, y, cost = map(int, sys.stdin.readline().split())
    arr.append([cost, x, y])
arr.sort()
  • ์ž…๋ ฅ๊ฐ’์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ณ  ๋ฐฐ์—ด์— ๊ฐ’์„ ํ• ๋‹นํ•ด์ค๋‹ˆ๋‹ค.
  • cost๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•ด์ค๋‹ˆ๋‹ค.



์ตœ์†Œ ๊ฐ€์ค‘์น˜ ์ฐพ๊ธฐ

answer = 0
for cost, x, y in arr:
    if find_parent(parent, x) != find_parent(parent, y) :
        union_parent(parent, x, y)
        answer += cost

print(answer)
  • ๋ถ€๋ชจ๊ฐ€ ๊ฐ™์ง€ ์•Š์„๋•Œ ๋ถ€๋ชจ๋ฅผ ๋ณ‘ํ•ฉํ•ด์ค๋‹ˆ๋‹ค.
  • ๋ถ€๋ชจ๊ฐ€ ๋ณ‘ํ•ฉ๋ ๋•Œ ๊ฐ€์ค‘์น˜๋ฅผ ์ง€์†์ ์œผ๋กœ answer ์— ๋”ํ•ด์ค๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ answer ๋ฅผ ์ถœ๋ ฅํ•ด์ค๋‹ˆ๋‹ค.
profile
โœ…ย ์ ๋‹นํ•œ ์ถ”์ƒํ™”๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€