Hello Ocean! ๐ŸŒผ

[๋ฐฑ์ค€/Python] 20040. ์‚ฌ์ดํด ๊ฒŒ์ž„ ๋ณธ๋ฌธ

Algorithm

[๋ฐฑ์ค€/Python] 20040. ์‚ฌ์ดํด ๊ฒŒ์ž„

bba_dda 2021. 10. 12. 15:44
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

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

์‚ฌ์ดํด ๊ฒŒ์ž„์€ ๋‘ ๋ช…์˜ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ฐจ๋ก€๋Œ€๋กœ ๋Œ์•„๊ฐ€๋ฉฐ ์ง„ํ–‰ํ•˜๋Š” ๊ฒŒ์ž„์œผ๋กœ, ์„  ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ํ™€์ˆ˜ ๋ฒˆ์งธ ์ฐจ๋ก€๋ฅผ, ํ›„ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ง์ˆ˜ ๋ฒˆ์งธ ์ฐจ๋ก€๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. ๊ฒŒ์ž„ ์‹œ์ž‘ ์‹œ 0 ๋ถ€ํ„ฐ n โˆ’ 1 ๊นŒ์ง€ ๊ณ ์œ ํ•œ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ€์—ฌ๋œ ํ‰๋ฉด ์ƒ์˜ ์  n ๊ฐœ๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ์ด ์ค‘ ์–ด๋Š ์„ธ ์ ๋„ ์ผ์ง์„  ์œ„์— ๋†“์ด์ง€ ์•Š๋Š”๋‹ค. ๋งค ์ฐจ๋ก€ ๋งˆ๋‹ค ํ”Œ๋ ˆ์ด์–ด๋Š” ๋‘ ์ ์„ ์„ ํƒํ•ด์„œ ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์„ ๋ถ„์„ ๊ธ‹๋Š”๋ฐ, ์ด์ „์— ๊ทธ๋ฆฐ ์„ ๋ถ„์„ ๋‹ค์‹œ ๊ทธ์„ ์ˆ˜๋Š” ์—†์ง€๋งŒ ์ด๋ฏธ ๊ทธ๋ฆฐ ๋‹ค๋ฅธ ์„ ๋ถ„๊ณผ ๊ต์ฐจํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ฒŒ์ž„์„ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ์‚ฌ์ดํด์„ ์™„์„ฑํ•˜๋Š” ์ˆœ๊ฐ„ ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋œ๋‹ค. ์‚ฌ์ดํด C๋Š” ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๊ทธ๋ฆฐ ์„ ๋ถ„๋“ค์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์œผ๋กœ, ๋‹ค์Œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค.

C์— ์†ํ•œ ์ž„์˜์˜ ์„ ๋ถ„์˜ ํ•œ ๋์ ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋ชจ๋“  ์„ ๋ถ„์„ ํ•œ ๋ฒˆ์”ฉ๋งŒ ์ง€๋‚˜์„œ ์ถœ๋ฐœ์ ์œผ๋กœ ๋˜๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

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

์ž…๋ ฅ์œผ๋กœ ์ ์˜ ๊ฐœ์ˆ˜ n๊ณผ m ๋ฒˆ์งธ ์ฐจ๋ก€๊นŒ์ง€์˜ ๊ฒŒ์ž„ ์ง„ํ–‰ ์ƒํ™ฉ์ด ์ฃผ์–ด์ง€๋ฉด ์‚ฌ์ดํด์ด ์™„์„ฑ ๋˜์—ˆ๋Š”์ง€๋ฅผ ํŒ๋‹จํ•˜๊ณ , ์™„์„ฑ๋˜์—ˆ๋‹ค๋ฉด ๋ช‡ ๋ฒˆ์งธ ์ฐจ๋ก€์—์„œ ์ฒ˜์Œ์œผ๋กœ ์‚ฌ์ดํด์ด ์™„์„ฑ๋œ ๊ฒƒ์ธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ž…๋ ฅ์€ ํ‘œ์ค€์ž…๋ ฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ž…๋ ฅ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ์ ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ 3 โ‰ค n โ‰ค 500,000 ๊ณผ ์ง„ํ–‰๋œ ์ฐจ๋ก€์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ 3 โ‰ค m โ‰ค 1,000,000 ์ด ์ฃผ์–ด์ง„๋‹ค. ๊ฒŒ์ž„์—์„œ ์‚ฌ์šฉํ•˜๋Š” n๊ฐœ์˜ ์ ์—๋Š” 0 ๋ถ€ํ„ฐ n โˆ’ 1 ๊นŒ์ง€ ๊ณ ์œ ํ•œ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ€์—ฌ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด ์ค‘ ์–ด๋Š ์„ธ ์ ๋„ ์ผ์ง์„  ์œ„์— ๋†“์ด์ง€ ์•Š๋Š”๋‹ค. ์ด์–ด์ง€๋Š” m ๊ฐœ์˜ ์ž…๋ ฅ ์ค„์—๋Š” ๊ฐ๊ฐ i๋ฒˆ์งธ ์ฐจ๋ก€์— ํ•ด๋‹น ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์„ ํƒํ•œ ๋‘ ์ ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค (1 โ‰ค i โ‰ค m).

์ถœ๋ ฅ

์ถœ๋ ฅ์€ ํ‘œ์ค€์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ์ผ€์ด์Šค์— ๋Œ€ํ•ด, m ๋ฒˆ์งธ ์ฐจ๋ก€๊นŒ์ง€ ๊ฒŒ์ž„์„ ์ง„ํ–‰ํ•œ ์ƒํ™ฉ์—์„œ ์ด๋ฏธ ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด ์‚ฌ์ดํด์ด ์ฒ˜์Œ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์ฐจ๋ก€์˜ ๋ฒˆํ˜ธ๋ฅผ ์–‘์˜ ์ •์ˆ˜๋กœ ์ถœ๋ ฅํ•˜๊ณ , m ๋ฒˆ์˜ ์ฐจ๋ก€๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•œ ์ดํ›„์—๋„ ์ข…๋ฃŒ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

Union - Find ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ถ€๋ชจ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. 

์ถ”๊ฐ€๋กœ size๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ, ๋‘ ํŠธ๋ฆฌ๋ฅผ ๋จธ์ง€ํ•  ๋•Œ size๊ฐ€ ์ž‘์€ ์ชฝ์„ ํฐ ์ชฝ ๋ฐ‘์— ๋‹ฌ์•„์ฃผ์—ˆ๋‹ค. 

size[i] : i ๋…ธ๋“œ์˜ ์ž์‹ ์ˆ˜

์ฝ”๋“œ

import sys
input = sys.stdin.readline

N, M = map(int, input().split())
# ๋ถ€๋ชจ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฐ์—ด
parent = [i for i in range(N)]
size = [1 for i in range(N)]

def find(n):
    if (parent[n] == n):
        return n
    else:
        parent[n] = find(parent[n])
        return parent[n]
def union(a, b):
    a = find(a)
    b = find(b)
    if size[a] > size[b]: # a๋ฐ‘์— b๋ฅผ ๋‹ฌ์•„์ค€๋‹ค = b์˜ ๋ถ€๋ชจ๋ฅผ a๋กœ ์„ค์ •
        parent[b] = a
        size[a] += size[b]
    else: # b ๋ฐ‘์— a๋ฅผ ๋‹ฌ์•„์ค€๋‹ค = a์˜ ๋ถ€๋ชจ๋ฅผ b๋กœ ์„ค์ • 
        parent[a] = b
        size[b] += size[a]

sys.setrecursionlimit(10 ** 9)
isDone = False
for m in range(1,M+1):
    a, b = map(int, input().split())
    if find(a) == find(b):
        print(m)
        isDone = True
        break
    union(a,b)
if not isDone:
    print(0)

๊ฒฐ๊ณผ

์ฐธ๊ณ 

์‹œ๊ฐ„์ดˆ๊ณผ์˜ ํ”์ ๋“ค...

python์ด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ ค์„œ ๊ทธ๋Ÿฐ์ง€,

์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ง„์ž‘ ๋™์ผํ–ˆ๋Š”๋ฐ ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ž์ž˜ํ•œ ๊ฒƒ๋“ค์„ ์ถ”๊ฐ€ํ•ด์•ผํ–ˆ๋‹ค. 

 

1. sys.setrecursionlimit(10 ** 9) ์ถ”๊ฐ€

์žฌ๊ท€ ํ•จ์ˆ˜ ๊นŠ์ด๋ฅผ ์ œํ•œํ•ด์„œ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์ด๋‹ค.

 

2. find(a) == find(b) ๋ฅผ unionํ•จ์ˆ˜ ๋‚ด์—์„œ ํ•˜๊ณ ์‹ถ์—ˆ๋Š”๋ฐ, ์‹œ๊ฐ„์ดˆ๊ณผ๋กœ ์ธํ•ด ๋ฐ–์œผ๋กœ ๋นผ์•ผํ–ˆ๋‹ค. 

๋ฐ˜์‘ํ˜•