We will find a way, we always have.

-interstellar

Problem Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 1185: ์œ ๋Ÿฝ ์—ฌํ–‰

Redddy 2023. 8. 24. 23:44

๐Ÿ”ˆ ๋ฌธ์ œ

๋ฏผ์‹์ด๋Š” ์—ฌ๋ฆ„์— ์œ ๋Ÿฝ์—ฌํ–‰์„ ๋– ๋‚  ๊ณ„ํš์ด๋‹ค. ๋ฐฉ๋ฌธํ•  ๋‚˜๋ผ๋Š” ์ด N๊ฐœ์˜ ๋‚˜๋ผ์ด๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ๋ฅผ ๋ถ™์˜€๋‹ค. ๋˜ํ•œ ์ด ๋‚˜๋ผ๋“ค ์‚ฌ์ด์— ์ด๋™ ๊ฐ€๋Šฅํ•œ ๊ธธ์€ M๊ฐœ๊ฐ€ ์žˆ๋Š”๋ฐ ๋ฏผ์‹์ด๋Š” ๊ท€์ฐฎ๊ธฐ ๋•Œ๋ฌธ์— N๊ฐœ์˜ ๋‚˜๋ผ๊ฐ€ ์„œ๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒƒ์„ ์œ ์ง€์‹œํ‚ค๋ฉด์„œ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๊ธธ์„ ์ง€๋„์—์„œ ์ œ๊ฑฐํ•˜๊ณ ์ž ํ•œ๋‹ค. ์ฆ‰, N-1๊ฐœ์˜ ๊ธธ๋งŒ์„ ๋‚จ๊ฒจ์•ผํ•  ๊ฒƒ์ด๋‹ค.

๊ฐ ๊ธธ์„ ํ†ต๊ณผํ•˜๊ธฐ ์œ„ํ•œ ๋น„์šฉ์ด ๊ฐ๊ธฐ ๋‹ค๋ฅด๊ณ  ํ•œ ๋‚˜๋ผ๋ฅผ ๋„์ฐฉํ•˜๋ฉด ๋‚ด์•ผํ•  ๋น„์šฉ ์—ญ์‹œ ๋‚˜๋ผ๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ์ •ํ•ด์ ธ์žˆ๋‹ค. ๋ฏผ์‹์ด๋Š” ๋ชจ๋“  ๋„์‹œ๋ฅผ ์ตœ์†Œ ํ•œ๋ฒˆ ์ด์ƒ ๋ฐฉ๋ฌธํ•˜๋ฉด์„œ ์ตœ์†Œ ๋น„์šฉ์ด ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ  ์žˆ๋‹ค. ๋ฌผ๋ก  ๊ธธ๊ณผ ๋‚˜๋ผ๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๊ณ , ์ฒซ ์‹œ์ž‘ ๋‚˜๋ผ๋Š” ๋ฏผ์‹์ด๊ฐ€ ์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ๋งˆ์ง€๋ง‰ ๋‚˜๋ผ๋Š” ์‹œ์ž‘ ๋‚˜๋ผ์ด์–ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฏผ์‹์ด์˜ ์œ ๋Ÿฝ ๊ณ„ํš์„ ๋„์™€์ฃผ์ž. 

 

๐Ÿ“์ž…๋ ฅ

์ฒซ ์ค„์—๋Š” ๋ฐฉ๋ฌธํ•  ๋‚˜๋ผ์˜ ์ˆ˜ N(5 ≤ N ≤ 10,000)๊ณผ ์ด ๋‚˜๋ผ๋“ค ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ธธ์˜ ์ˆ˜ P(N-1 ≤ P ≤ 100,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” N+1๋ฒˆ์งธ ์ค„๊นŒ์ง€ i+1๋ฒˆ์งธ ์ค„์—๋Š” i๋ฒˆ์งธ ๋‚˜๋ผ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ ๋“œ๋Š” ๋น„์šฉ C
i (1 ≤ Ci ≤ 1,000)๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค. ๋‹ค์Œ P๊ฐœ์˜ ์ค„์—๋Š” P๊ฐœ์˜ ๊ธธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์˜๋ฏธํ•˜๋Š” ์„ธ ์ •์ˆ˜ Sj, Ej, Lj๊ฐ€ ์ž…๋ ฅ๋˜๋Š”๋ฐ ์ด๋Š” Sj๋ฒˆ์งธ ๋‚˜๋ผ์™€ Ej๋ฒˆ์งธ ๋‚˜๋ผ ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐ์ง“๋Š” ๊ธธ์„ ํ†ต๊ณผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Lj ๋น„์šฉ์ด ๋“ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. (Sj ≠ E j, 0 ≤ Lj ≤1,000)

 

๐Ÿ“‘์ถœ๋ ฅ

์ฒซ ์ค„์— ๋ฏผ์‹์ด๊ฐ€ ์œ ๋Ÿฝ์—ฌํ–‰์„ ๋งˆ์น˜๊ธฐ ์œ„ํ•œ ์ตœ์†Œ๋น„์šฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ“š ๋ฌธ์ œ ํ’€์ด

 

๋ฌธ์ œ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์ •๋ฆฌํ•ด๋ณด๋ฉด ์šฐ์„  n-1 ๊ฐœ์˜ ๊ฐ„์„ ์œผ๋กœ ๊ตฌ์„ฑ๋œ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. 

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

n-1๊ฐœ์˜ ๊ฐ„์„ ์œผ๋กœ ๊ตฌ์„ฑ๋œ ํŠธ๋ฆฌ๊ธฐ์— a -> b์˜ ๊ฒฝ๋กœ๋Š” ์œ ์ผํ•˜๋‹ค. ๋ฐ˜๋Œ€๋กœ b -> a์˜ ๊ฒฝ๋กœ๋„ ์œ ์ผํ•œ๋ฐ a -> b ๋ฅผ ๋’ค์ง‘์€ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. 

 

๊ธฐ๋ณธ์ ์ธ MST ๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ์—๋Š” ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ์—์„œ๋Š” ์ผ๋‹จ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด ํ•ด๋‹น ํŠธ๋ฆฌ์— ํฌํ•จ๋˜๋Š” ๊ฐ„์„ ์€ ๋ฌด์กฐ๊ฑด ๋‘๋ฒˆ๋งŒ ์‚ฌ์šฉ๋˜๊ธฐ์— ์ด๋™์‹œ์— ์‚ฌ์šฉ๋˜๋Š” ๋น„์šฉ์€ (ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ๋Š” ๊ฐ„์„ ) * 2 ๋ฅผ ํ•˜์—ฌ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋•Œ๋ฌธ์— ๋‹จ์ˆœํžˆ ๊ฐ„์„ ๋งŒ ๊ฐ€์ง€๊ณ  ์ •๋ ฌํ•˜๊ธฐ์—” ๋ฌด์–ธ๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค. 

 

๊ทธ๋Ÿผ ์ด์ œ ๋…ธ๋“œ์— ์ดˆ์ ์„ ๋‘ฌ๋ณด์ž. ๋…ธ๋“œ ๋ฐฉ๋ฌธ ํšŸ์ˆ˜๋Š” ํ•ด๋‹น ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฐ„์„ ์˜ ๊ฐฏ์ˆ˜์— ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค. a ๋ผ๋Š” ๋…ธ๋“œ์— ์ด 4๊ฐœ์˜ ๊ฐ„์„ ์ด ์žˆ๋‹ค๋ฉด a ๋…ธ๋“œ๋Š” 4๋ฒˆ ๋ฐฉ๋ฌธํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹œ์ž‘์  ๋…ธ๋“œ๋Š” ์ถ”๊ฐ€๋กœ ํ•œ๋ฒˆ ๋” ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์‹œ์ž‘์ ์€ ๊ฐ ๋‚˜๋ผ์˜ ๋ฐฉ๋ฌธ ๋น„์šฉ์ค‘ ์ตœ์†Œ์ธ ๊ณณ์œผ๋กœ ์žก๋Š”๊ฒƒ์ด ์ตœ์†Œ๋น„์šฉ์ด ๋œ๋‹ค.

 

์œ ๋Ÿฝ ์—ฌํ–‰์— ๋“œ๋Š” ๋น„์šฉ์€ n-1 ๊ฐœ์˜ ๊ฐ„์„ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํŠธ๋ฆฌ์—์„œ, (๊ฐ„์„ ์˜ ์ดํ•ฉ)*2 + (๋ฐฉ๋ฌธ ๋น„์šฉ * ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ๋œ ๊ฐ„์„  ๊ฐฏ์ˆ˜) + ์ตœ์†Œ๋น„์šฉ ์ด ๋œ๋‹ค. 

 

์ด์ œ๋Š” ํŠธ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š”์ง€๊ฐ€ ๊ด€๊ฑด์ด๋‹ค. 

๊ฐ„์„ ์„ ์ง€๋‚˜๊ฐˆ๋•Œ ๊ทธ ๊ฐ„์„ ์˜ ๋น„์šฉ๋งŒ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ„์„ ์ด ์ด์–ด์ฃผ๊ณ  ์žˆ๋Š” ๋…ธ๋“œ์˜ ๋ฐฉ๋ฌธ ๋น„์šฉ๋„ ์ถ”๊ฐ€๊ฐ€ ๋œ๋‹ค. ์ด ๋ฐฉ๋ฌธ๋น„์šฉ๊นŒ์ง€ ์ถ”๊ฐ€ํ•ด์„œ ์ •๋ ฌ๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค!!! 

 

 

๐Ÿ’ป ์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# ๊ฐ„์„ ์€ ์ •ํ™•์ด ๋‘๋ฒˆ ์‚ฌ์šฉ
# ์ •์ ์€ ๋‘๋ฒˆ์ด์ƒ
import sys, heapq
input = sys.stdin.readline
 
def find(parent:list[int], x:int-> int:
    if parent[x] != x:
        parent[x] = find(parent, parent[x])
    return parent[x]
 
def union(parent:list[int], a:int, b:int-> None:
    a = find(parent, a)
    b = find(parent, b)
 
    if a < b:
        parent[b] = a
    else:
        parent[a] = b
 
def solve():
    n,p = map(int,input().split())
    parent = [i for i in range(n+1)]
    cost = [0+ [int(input()) for _ in range(n)]
    edges = [list(map(int,input().split())) for _ in range(p)]
    edges.sort(key=lambda x:2*x[2]+cost[x[0]]+cost[x[1]])
    ans = min(cost[1:])
    mst = 0
 
    for u,v,w in edges:
        if find(parent, u) != find(parent, v):
            union(parent, u, v)
            ans += 2*w+cost[u]+cost[v]
            mst += 1
            if mst == n-1: break
    return ans
if __name__ == "__main__":
    print(solve())
cs

 

๐Ÿญ ์‹œํ–‰์ฐฉ์˜ค

 

์—ด์‹ฌํžˆ ์ตœ์ ํ™” ํ•˜์—ฌ 

 

 

ํŒŒ์ด์ฌ ์œ ์ €์ค‘ 1๋“ฑ(20230824 ๊ธฐ์ค€)์ด๋‹ค! 

 

ํ‹€๋ ธ๋˜ ์ด์œ ๋Š” ์ •๋ ฌํ•  ๋•Œ (๊ฐ„์„  ๋น„์šฉ + a์˜ ๋ฐฉ๋ฌธ ๋น„์šฉ + b์˜ ๋ฐฉ๋ฌธ ๋น„์šฉ) ์ด๋ ‡๊ฒŒ ์ •๋ ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฌธ์ œ์˜ ์กฐ๊ฑด์ค‘ ๊ฐ„์„ ์˜ ๋น„์šฉ์ด 0 ์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์กฐ๊ฑด์ด ์žˆ๋‹ค. ๊ฐ„์„ ์€ ๋ฌด์กฐ๊ฑด ๋‘๋ฒˆ ์‚ฌ์šฉ๋˜๋‹ˆ (๊ฐ„์„  ๋น„์šฉ*2 + a์˜ ๋ฐฉ๋ฌธ ๋น„์šฉ + b์˜ ๋ฐฉ๋ฌธ ๋น„์šฉ) ์ด๋ ‡๊ฒŒ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด ๋งž๋‹ค. 

 

๐Ÿ”— ๋ฌธ์ œ๋งํฌ 1185 ์œ ๋Ÿฝ์—ฌํ–‰

 

1185๋ฒˆ: ์œ ๋Ÿฝ์—ฌํ–‰

์ฒซ ์ค„์—๋Š” ๋ฐฉ๋ฌธํ•  ๋‚˜๋ผ์˜ ์ˆ˜ N(5 ≤ N ≤ 10,000)๊ณผ ์ด ๋‚˜๋ผ๋“ค ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ธธ์˜ ์ˆ˜ P(N-1 ≤ P ≤ 100,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” N+1๋ฒˆ์งธ ์ค„๊นŒ์ง€ i+1๋ฒˆ์งธ ์ค„์—๋Š” i๋ฒˆ์งธ ๋‚˜๋ผ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ ๋“œ๋Š” ๋น„

www.acmicpc.net