[BOJ][๐ŸŸก4][๋ฐฑ์ค€#01976] ์—ฌํ–‰ ๊ฐ€์ž

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #1976


๋ฌธ์ œ

๋™ํ˜์ด๋Š” ์นœ๊ตฌ๋“ค๊ณผ ํ•จ๊ป˜ ์—ฌํ–‰์„ ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ํ•œ๊ตญ์—๋Š” ๋„์‹œ๊ฐ€ N๊ฐœ ์žˆ๊ณ  ์ž„์˜์˜ ๋‘ ๋„์‹œ ์‚ฌ์ด์— ๊ธธ์ด ์žˆ์„ ์ˆ˜๋„, ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋™ํ˜์ด์˜ ์—ฌํ–‰ ์ผ์ •์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด ์—ฌํ–‰ ๊ฒฝ๋กœ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ธ์ง€ ์•Œ์•„๋ณด์ž. ๋ฌผ๋ก  ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ๋„์‹œ๋ฅผ ๊ฒฝ์œ ํ•ด์„œ ์—ฌํ–‰์„ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋„์‹œ๊ฐ€ 5๊ฐœ ์žˆ๊ณ , A-B, B-C, A-D, B-D, E-A์˜ ๊ธธ์ด ์žˆ๊ณ , ๋™ํ˜์ด์˜ ์—ฌํ–‰ ๊ณ„ํš์ด E C B C D ๋ผ๋ฉด E-A-B-C-B-C-B-D๋ผ๋Š” ์—ฌํ–‰๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๋„์‹œ๋“ค์˜ ๊ฐœ์ˆ˜์™€ ๋„์‹œ๋“ค ๊ฐ„์˜ ์—ฐ๊ฒฐ ์—ฌ๋ถ€๊ฐ€ ์ฃผ์–ด์ ธ ์žˆ๊ณ , ๋™ํ˜์ด์˜ ์—ฌํ–‰ ๊ณ„ํš์— ์†ํ•œ ๋„์‹œ๋“ค์ด ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์กŒ์„ ๋•Œ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๊ฐ™์€ ๋„์‹œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.


์ž…๋ ฅ

์ฒซ ์ค„์— ๋„์‹œ์˜ ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 200์ดํ•˜์ด๋‹ค. ๋‘˜์งธ ์ค„์— ์—ฌํ–‰ ๊ณ„ํš์— ์†ํ•œ ๋„์‹œ๋“ค์˜ ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. M์€ 1000์ดํ•˜์ด๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” N๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. i๋ฒˆ์งธ ์ค„์˜ j๋ฒˆ์งธ ์ˆ˜๋Š” i๋ฒˆ ๋„์‹œ์™€ j๋ฒˆ ๋„์‹œ์˜ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.ย 1์ด๋ฉด ์—ฐ๊ฒฐ๋œ ๊ฒƒ์ด๊ณ  0์ด๋ฉด ์—ฐ๊ฒฐ์ด ๋˜์ง€ ์•Š์€ ๊ฒƒ์ด๋‹ค. A์™€ B๊ฐ€ ์—ฐ๊ฒฐ๋˜์—ˆ์œผ๋ฉด B์™€ A๋„ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์ค„์—๋Š” ์—ฌํ–‰ ๊ณ„ํš์ด ์ฃผ์–ด์ง„๋‹ค. ๋„์‹œ์˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ N๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค.


์ถœ๋ ฅ

์ฒซ ์ค„์— ๊ฐ€๋Šฅํ•˜๋ฉด YES ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด NO๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


์˜ˆ์ œ

์ž…๋ ฅ

3
3
0 1 0
1 0 1
0 1 0
1 2 3


์ถœ๋ ฅ

YES


My Sol

def find(x):
    if x == p[x]:
        return x
    p[x] = find(p[x])
    return p[x]

def check():
    global root
    for n in path:
        if not find(n) == root: return 'NO'
    return 'YES'

N = int(input())
M = int(input())
mat = [list(map(int, input().split())) for _ in range(N)]
path = list(map(lambda x: int(x)-1, input().split()))

p = list(range(N))
for u in range(1, N):
    for v in range(u):
        if not mat[u][v]: continue
        a = find(u)
        b = find(v)
        if a == b: continue
        p[a] = b

root = find(path[0])
print(check())

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


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!

๋ถ€๋ชจ ํƒœ๊ทธ๋ฅผ union ํ•ด์ฃผ๋Š” ๊ฒŒ find(x), find(y)ํ•œ ๊ฒƒ ์ž์ฒด๋ฅผ p๋กœ ๋ฌถ์–ด์ฃผ๋Š” ๊ฑด๋ฐ ์ด ๋ถ€๋ถ„์ด ํ—ท๊ฐˆ๋ ค์„œ ์ž๊พธ ํ‹€๋ฆฐ๋‹ค. ์ด๊ฑธ ์ž์ฃผ ์‹ค์ˆ˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.


๋ชจ๋ฒ”๋‹ต์•ˆ

์ถœ์ฒ˜

# empty

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ