๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Problem_Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 1368 ๋ฌผ๋Œ€๊ธฐ (Python/ํŒŒ์ด์ฌ)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2022. 10. 16.

<๋ฌธ์ œ ๋งํฌ>

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

 

1368๋ฒˆ: ๋ฌผ๋Œ€๊ธฐ

์ฒซ ์ค„์—๋Š” ๋…ผ์˜ ์ˆ˜ N(1 ≤ N ≤ 300)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” i๋ฒˆ์งธ ๋…ผ์— ์šฐ๋ฌผ์„ ํŒ” ๋•Œ ๋“œ๋Š” ๋น„์šฉ Wi(1 ≤ Wi ≤ 100,000)๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ๋“ค์–ด์˜จ๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์— ๋Œ€ํ•ด์„œ๋Š” ๊ฐ ์ค„์— N๊ฐœ์˜ ์ˆ˜๊ฐ€ ๋“ค์–ด

www.acmicpc.net

 

<ํ’€์ด ์ „๋žต>

  1. ๋…ผ ์—ฐ๊ฒฐ ๋ถ€๋ถ„์ด๋‚˜ ๋ฌธ์ œ ์ •๋ณด๋ฅผ ๋ณด๋ฉด ๋ญ”๊ฐ€ ๊ทธ๋ž˜ํ”„๋‚˜ ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™์€๋ฐ '์šฐ๋ฌผ ํŒŒ๊ธฐ'๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€๊ฐ€ ๊ด€๊ฑด์ด๋‹ค.
  2. ๊ฒฐ๋ก ์ ์œผ๋กœ ์šฐ๋ฌผ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ€์ƒ์˜ ๋…ธ๋“œ N+1๋ฒˆ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ๋…ธ๋“œ์˜ ๊ฐ„์„  ๋น„์šฉ์„ ์šฐ๋ฌผ ํŒŒ๋Š” ๋น„์šฉ์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
  3. ๋‚˜๋จธ์ง€๋Š” ์ผ๋ฐ˜์ ์ธ ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ ๋ฌธ์ œ๋ž‘ ๋น„์Šทํ•˜๋‹ค.
  4. ๊ฐ€์ƒ์˜ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์ค˜์„œ ์ž…๋ ฅ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ ‘๊ทผ์ด๋ž‘ ๋ฐœ์ƒ์ด ์ค‘์š”ํ•œ ๋ฌธ์ œ๋‹ค.
  5. ์ฐธ๊ณ ๋กœ (23743 - ๋ฐฉํƒˆ์ถœ) ๋ฌธ์ œ๋„ ์ด์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๋‹ˆ ๊ฐ™์ด ํ’€์–ด๋ณด์ž

 

<์ •๋‹ต ์ฝ”๋“œ>

import sys, os, io, atexit

input = lambda: sys.stdin.readline().rstrip('\r\n')
stdout = io.BytesIO()
sys.stdout.write = lambda s: stdout.write(s.encode("ascii"))
atexit.register(lambda: os.write(1, stdout.getvalue()))

# 220927 1368 ๋ฌผ๋Œ€๊ธฐ

# ์ •๋‹ต์ฝ”๋“œ


# find ํ•จ์ˆ˜ (๊ฒฝ๋กœ ์••์ถ•)
def find(x):
    if parent[x] != x:
        parent[x] = find(parent[x])
    return parent[x]


# ์œ ๋‹ˆ์˜จ ํ•จ์ˆ˜
def merge(x, y):
    x = find(x)
    y = find(y)

    if x < y:
        parent[y] = x
    else:
        parent[x] = y
    
    return

# N: ๋…ผ์˜ ์ˆ˜
N = int(input())
# parent: ๋ถ€๋ชจ ๋…ธ๋“œ (N + 1๊นŒ์ง€)
parent = [i for i in range(N + 2)]

# graph: ์ธ์ ‘ํ–‰๋ ฌใ„น ๋‚˜ํƒ€๋‚ธ ๊ทธ๋ž˜ํ”„
graph = []
# ์šฐ๋ฌผ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ€์ƒ์˜ ๋…ธ๋“œ(N + 1)์„ ๋งŒ๋“ค์–ด์„œ ์šฐ๋ฌผ ๋น„์šฉ์„ ๊ฐ„์„  ๋น„์šฉ์œผ๋กœ ํ•ด์„œ ๊ทธ๋ž˜ํ”„์— ๋„ฃ์–ด์ค€๋‹ค.
for i in range(1, N + 1):
    graph.append((int(input()), N + 1, i))

# arr: ๊ฐ„์„  ๊ฐ„ ์—ฐ๊ฒฐ ์ •๋ณด
arr = [list(map(int, input().split())) for _ in range(N)]
for r in range(N - 1):
    for c in range(r + 1, N):
        graph.append((arr[r][c], r + 1, c + 1))

# ๊ฐ„์„  ๋น„์šฉ ์ •๋ ฌ
graph.sort()

# ans: ๋ฌผ์„ ๋Œ€๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ๋น„์šฉ
ans = 0

# ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๋กœ ๋น„์šฉ ๊ตฌํ•˜๊ธฐ
for i in range(len(graph)):
    cost, node1, node2 = graph[i]
    if find(node1) != find(node2):
        merge(node1, node2)
        ans += cost

# ์ •๋‹ต ์ถœ๋ ฅ
print(ans)

๋Œ“๊ธ€