๐Ÿค–/๋ฐฑ์ค€

๋ฐฑ์ค€ 2887: ํ–‰์„ฑ ํ„ฐ๋„ (Python)

sssbin 2022. 8. 4. 21:35

 

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

 

2887๋ฒˆ: ํ–‰์„ฑ ํ„ฐ๋„

์ฒซ์งธ ์ค„์— ํ–‰์„ฑ์˜ ๊ฐœ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค N โ‰ค 100,000) ๋‹ค์Œ N๊ฐœ ์ค„์—๋Š” ๊ฐ ํ–‰์„ฑ์˜ x, y, z์ขŒํ‘œ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ขŒํ‘œ๋Š” -109๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 109๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์ด๋‹ค. ํ•œ ์œ„์น˜์— ํ–‰์„ฑ์ด ๋‘ ๊ฐœ ์ด

www.acmicpc.net

 

์ฒ˜์Œ์—๋Š” 1774๋ฒˆ(์šฐ์ฃผ์‹ ๊ณผ์˜ ๊ต๊ฐ) ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋น„์šฉ์— ๋”ฐ๋ฅธ ๊ฐ„์„ ์„ ๋ชจ๋‘ ์ •์˜ํ•ด์ฃผ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฌธ์ œ ์กฐ๊ฑด์—์„œ n์˜ ์ˆ˜๊ฐ€ ๊ต‰์žฅํžˆ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

import sys
input = sys.stdin.readline

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

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

n = int(input())

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

planet = [0] * (n+1)
for i in range(1, n+1):
    planet[i] = list(map(int, input().split()))

edges = []
for i in range(1, n+1):
    for j in range(1, n+1):
        x = abs(planet[i][0] - planet[j][0])
        y = abs(planet[i][1] - planet[j][1])
        z = abs(planet[i][2] - planet[j][2])
        edges.append((min(x, y, z), i, j))
edges.sort()

res = 0
for i in edges:
    c, a, b = i
    if find(parent, a) != find(parent, b):
        union(parent, a, b)
        res += c

print(res)

 

๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๊ณ ๋ คํ•˜๋Š” ๊ฐ„์„ ์˜ ์ˆ˜๋ฅผ ์ค„์—ฌ์•ผ ํ•œ๋‹ค.

๋ฌธ์ œ ์กฐ๊ฑด์—์„œ ๋น„์šฉ์€ min(|xA-xB|, |yA-yB|, |zA-zB|)์ด๊ธฐ ๋•Œ๋ฌธ์—

 

1. x๊ฐ’ ๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ

2. ์„œ๋กœ ์ธ์ ‘ํ•œ ํ–‰์„ฑ์˜ ๋น„์šฉ๋งŒ์„ ๊ณ ๋ คํ•œ๋‹ค. [i] ~ [i+1]

      ใ„ด [i] ~ [i+2]๋Š” [i] ~ [i+1] + [i+1] ~ [i+2] ์™€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ๋ คํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

3. ์ฆ‰, n๊ฐœ์˜ ํ–‰์„ฑ์— ๋Œ€ํ•ด n-1๊ฐœ์˜ ๊ฐ„์„ ๋งŒ ๊ณ ๋ คํ•˜๋ฉด ๋œ๋‹ค.

4. y, z์— ๋Œ€ํ•ด์„œ๋„ ์œ„์™€ ๊ฐ™์€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ„์„ ์˜ ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 

import sys
input = sys.stdin.readline

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

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

n = int(input())

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

planet = []
for i in range(1, n+1):
    x, y, z = map(int, input().split())
    planet.append((i, x, y, z))

edges = []
for i in range(1, 4):
    planet.sort(key=lambda x: x[i])  # x๊ฐ’, y๊ฐ’, z๊ฐ’ ๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
    for j in range(n-1):
        edges.append((abs(planet[j+1][i]-planet[j][i]), planet[j][0], planet[j+1][0])) # ๊ฐ„์„  ์ •๋ณด ์ถ”๊ฐ€
edges.sort() # ๋น„์šฉ ์ˆœ์œผ๋กœ ์ •๋ ฌ

res = 0
for i in edges:
    c, a, b = i
    if find(parent, a) != find(parent, b):
        union(parent, a, b)
        res += c

print(res)