๐ฑ ๋ฌธ์
๐ฑ ํ์ด
0. ์ ๋ ฅ ๋ฐ๊ธฐ ๋ฐ ๋ณ์ ์ด๊ธฐํ
n = int(input())
m = int(input())
graph = []
parent = [i for i in range(n + 1)]
for i in range(n):
graph.append([idx + 1 for idx, i in enumerate(list(map(int, input().split()))) if i == 1])
plan = list(map(int, input().split()))
- ์ ์ฒด ๋์ ๊ฐ์
n
, ์ฌํ ๋์ ๊ฐ์m
, ๋์ ์ฐ๊ฒฐ ์ ๋ณดgraph
๋ฅผ ์ ๋ ฅ๋ฐ์ต๋๋ค. parent
๋ ๋ถ๋ชจ ๋ ธ๋ ์ ๋ณด(์งํฉ ์ ๋ณด)๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ์ ๋๋ค.
1. Union-Find ์๊ณ ๋ฆฌ์ฆ
def find(x):
if parent[x] != x:
parent[x] = find(parent[x])
return parent[x]
return x
def union(x, y):
x = find(x)
y = find(y)
if x > y:
parent[x] = y
else:
parent[y] = x
์ด ๋ฌธ์ ๋ union-find ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ์ฌํ ๊ณํ์ ์๋ ๋์๋ค์ด ๋ชจ๋ ๊ฐ์ ์งํฉ์ ์๋์ง ๊ฒ์ฌํ๋ ๋ฌธ์ ์ ๋๋ค.
์ด๋ findํจ์์์ ๊ฒฝ๋ก์์ถ์ ํด์ฃผ์ด์ผ ํฉ๋๋ค. ๊ฒฝ๋ก์์ถ์ด๋, find()
ํจ์์์ ๋ถ๋ชจ๋
ธ๋๋ฅผ ์ฐพ์๊ฐ๋ ๊ณผ์ ์์ ๋ถ๋ชจ ๋
ธ๋๋ฅผ ์
๋ฐ์ดํธ ํ๋ ๊ฒ์ ๋งํฉ๋๋ค. Union Find ์๊ณ ๋ฆฌ์ฆ์ ๋ํ ์์ธํ ์ค๋ช
์ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์๊ธธ ๋ฐ๋๋๋ค.
2. ์งํฉ ๋ง๋ค๊ธฐ
for idx, connected_nodes in enumerate(graph):
for v in connected_nodes:
union(idx + 1, v)
์
๋ ฅ ๋ฐ์ ๋์ ์ฐ๊ฒฐ ์ ๋ณด(graph
)์ ๋ฐ๋ผ ๋์๊ฐ ์ฐ๊ฒฐ๋์ด์์ผ๋ฉด union()
ํ์ฌ parent
๋ฆฌ์คํธ๋ฅผ ์
๋ฐ์ดํธํด๋๊ฐ๋๋ค.
3. ์ฌํ ๊ณํ ๊ฒ์ฌ
result = True
root = parent[plan[0]]
for p in plan[1:]:
if parent[p] != root:
result = False
break
if result == True:
print("YES")
else:
print("NO")
์ ๋ ฅ๋ฐ์ ์ฌํ ๊ณํ์์ ๋ชจ๋ ์ฌํ ๊ณํ ๋์๊ฐ ๊ฐ์ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ๊ฐ์ง๋ฉด "YES"๋ฅผ ์ถ๋ ฅ, ๊ทธ๋ ์ง ์์ผ๋ฉด "NO"๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
๐ฑ ์ฝ๋
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# boj 1976 ์ฌํ๊ฐ์
n = int(input())
m = int(input())
graph = []
visited = [False] * (n + 1)
parent = [i for i in range(n + 1)]
for i in range(n):
graph.append([idx + 1 for idx, i in enumerate(list(map(int, input().split()))) if i == 1])
plan = list(map(int, input().split()))
def find(x):
if parent[x] != x:
parent[x] = find(parent[x])
return parent[x]
return x
def union(x, y):
x = find(x)
y = find(y)
if x > y:
parent[x] = y
else:
parent[y] = x
for idx, connected_nodes in enumerate(graph):
for v in connected_nodes:
union(idx + 1, v)
result = True
root = parent[plan[0]]
for p in plan[1:]:
if parent[p] != root:
result = False
break
if result == True:
print("YES")
else:
print("NO")
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] #2110 ๊ณต์ ๊ธฐ ์ค์น (์ด๋ถํ์, Python) (0) | 2023.02.26 |
---|---|
[BOJ] #2252 ์ค ์ธ์ฐ๊ธฐ (Python) (0) | 2023.02.22 |
[BOJ] #13144 List of Unique Numbers (Python) (0) | 2023.02.21 |
[BOJ] #18405 ๊ฒฝ์์ ์ ์ผ (Python) (0) | 2023.02.15 |
[BOJ] #2230 ์ ๊ณ ๋ฅด๊ธฐ (Python) (0) | 2023.02.14 |
๋๊ธ