๐Ÿงฉ Problem Solving/[๋ฐฑ์ค€]

[๋ฐฑ์ค€] 1647 ๋„์‹œ ๋ถ„ํ•  ๊ณ„ํš (python ํŒŒ์ด์ฌ)

์ œ๋ด‰์•„ 2022. 8. 1. 04:09

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

 

1647๋ฒˆ: ๋„์‹œ ๋ถ„ํ•  ๊ณ„ํš

์ฒซ์งธ ์ค„์— ์ง‘์˜ ๊ฐœ์ˆ˜ N, ๊ธธ์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 2์ด์ƒ 100,000์ดํ•˜์ธ ์ •์ˆ˜์ด๊ณ , M์€ 1์ด์ƒ 1,000,000์ดํ•˜์ธ ์ •์ˆ˜์ด๋‹ค. ๊ทธ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ M์ค„์— ๊ฑธ์ณ ๊ธธ์˜ ์ •๋ณด๊ฐ€ A B C ์„ธ ๊ฐœ์˜ ์ •์ˆ˜๋กœ ์ฃผ์–ด์ง€๋Š”๋ฐ A๋ฒˆ

www.acmicpc.net


๋‚œ์ด๋„์— ๋น„ํ•ด ๋งค์šฐ ๊ฐ„๊ฒฐํ•œ ๋ฌธ์ œ๋‹ค. 

๋Œ€์‹  ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.


์•„์ด๋””์–ด

1. ๋งˆ์„์„ ๋‘ ๊ฐœ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ์ž˜ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์‰ฝ๊ฒŒ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
  • ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์—ฌ๊ธฐ์„œ ๋น„์šฉ์ด ๊ฐ€์žฅ ํฐ ๊ฐ„์„ ์„ ์ž˜๋ผ์ฃผ๋ฉด ๋œ๋‹ค.
  • ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ์—์„œ๋Š” ์‚ฌ์ดํด์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ ๊ฐ„์„  ํ•˜๋‚˜๋งŒ ์ž˜๋ผ์ฃผ๋ฉด ๋‘ ๊ฐœ์˜ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

์ „์ฒด ์ฝ”๋“œ

import sys

def find_parent(x):
    if parent[x] != x:
        parent[x] = find_parent(parent[x])
    return parent[x]

def union(a, b):
    a = find_parent(a)
    b = find_parent(b)
    if a < b:
        parent[b] = a
    else:
        parent[a] = b

N, M = map(int, input().split())

parent = [0] * (N + 1)
for i in range(1, N + 1):
    parent[i] = i


graph = []
for _ in range(M):
    graph.append([int(x) for x in sys.stdin.readline().rstrip().split()])

graph.sort(key= lambda x:x[2])

result = 0
max_cost = 0

for edge in graph:
    start, end, cost = edge
    if find_parent(start) != find_parent(end):
        union(start, end)
        result += cost
        max_cost = max(cost, max_cost)

print(result - max_cost)

์ฝ”๋“œ ์„ค๋ช…

def find_parent(x):
    if parent[x] != x:
        parent[x] = find_parent(parent[x])
    return parent[x]

def union(a, b):
    a = find_parent(a)
    b = find_parent(b)
    if a < b:
        parent[b] = a
    else:
        parent[a] = b

์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด๋‹ค.

์ด ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋„˜์–ด๊ฐ€๊ฒ ๋‹ค.

 

graph.sort(key= lambda x:x[2])

result = 0
max_cost = 0

for edge in graph:
    start, end, cost = edge
    if find_parent(start) != find_parent(end):
        union(start, end)
        result += cost
        max_cost = max(cost, max_cost)

print(result - max_cost)

๊ฐ„์„ ์˜ ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๊ทธ๋ž˜ํ”„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋น„์šฉ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฐ ๊ฐ„์„ ์„ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•ด๊ฐ€๋ฉด์„œ

์‚ฌ์ดํด์ด ์ƒ๊ธฐ๋Š”์ง€ ์•ˆ ์ƒ๊ธฐ๋Š”์ง€ ํ™•์ธํ•ด์ค€๋‹ค.

์‚ฌ์ดํด์ด ์•ˆ ์ƒ๊ธฐ๋ฉด ์ง‘ํ•ฉ์— ํฌํ•จํ•ด์ฃผ๊ณ  ๋น„์šฉ์„ ์—…๋ฐ์ดํŠธํ•ด์ค€๋‹ค.

 

์ดํ›„ ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๊ฐ€ ์™„์„ฑ๋˜๋ฉด ์—ฌ๊ธฐ์„œ ๋น„์šฉ์ด ๊ฐ€์žฅ ํฐ ๊ฐ„์„ ์„ ์ง€์›Œ์•ผ ํ•˜๋ฏ€๋กœ

๋ฏธ๋ฆฌ ์ €์žฅํ•ด๋‘” max_cost๊ฐ’์„ ๋นผ์ค€๋‹ค.