https://www.acmicpc.net/problem/1043
๋ฌธ์
์ง๋ฏผ์ด๋ ํํฐ์ ๊ฐ์ ์ด์ผ๊ธฐ ํ๋ ๊ฒ์ ์ข์ํ๋ค. ํํฐ์ ๊ฐ ๋๋ง๋ค, ์ง๋ฏผ์ด๋ ์ง๋ฏผ์ด๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ์ด์ผ๊ธฐ๋ฅผ ํ๋ค. ์ง๋ฏผ์ด๋ ๊ทธ ์ด์ผ๊ธฐ๋ฅผ ๋งํ ๋, ์๋ ๊ทธ๋๋ก ์ง์ค๋ก ๋งํ๊ฑฐ๋ ์์ฒญ๋๊ฒ ๊ณผ์ฅํด์ ๋งํ๋ค. ๋น์ฐํ ๊ณผ์ฅํด์ ์ด์ผ๊ธฐํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ฌ๋ฏธ์๊ธฐ ๋๋ฌธ์, ๋๋๋ก์ด๋ฉด ๊ณผ์ฅํด์ ์ด์ผ๊ธฐํ๋ ค๊ณ ํ๋ค. ํ์ง๋ง, ์ง๋ฏผ์ด๋ ๊ฑฐ์ง๋ง์์ด๋ก ์๋ ค์ง๊ธฐ๋ ์ซ์ดํ๋ค. ๋ฌธ์ ๋ ๋ช๋ช ์ฌ๋๋ค์ ๊ทธ ์ด์ผ๊ธฐ์ ์ง์ค์ ์๋ค๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ด๋ฐ ์ฌ๋๋ค์ด ํํฐ์ ์์ ๋๋, ์ง๋ฏผ์ด๋ ์ง์ค์ ์ด์ผ๊ธฐํ ์ ๋ฐ์ ์๋ค. ๋น์ฐํ, ์ด๋ค ์ฌ๋์ด ์ด๋ค ํํฐ์์๋ ์ง์ค์ ๋ฃ๊ณ , ๋๋ค๋ฅธ ํํฐ์์๋ ๊ณผ์ฅ๋ ์ด์ผ๊ธฐ๋ฅผ ๋ค์์ ๋๋ ์ง๋ฏผ์ด๋ ๊ฑฐ์ง๋ง์์ด๋ก ์๋ ค์ง๊ฒ ๋๋ค. ์ง๋ฏผ์ด๋ ์ด๋ฐ ์ผ์ ๋ชจ๋ ํผํด์ผ ํ๋ค.
์ฌ๋์ ์ N์ด ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ด์ผ๊ธฐ์ ์ง์ค์ ์๋ ์ฌ๋์ด ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ํํฐ์ ์ค๋ ์ฌ๋๋ค์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์ง๋ฏผ์ด๋ ๋ชจ๋ ํํฐ์ ์ฐธ๊ฐํด์ผ ํ๋ค. ์ด๋, ์ง๋ฏผ์ด๊ฐ ๊ฑฐ์ง๋ง์์ด๋ก ์๋ ค์ง์ง ์์ผ๋ฉด์, ๊ณผ์ฅ๋ ์ด์ผ๊ธฐ๋ฅผ ํ ์ ์๋ ํํฐ ๊ฐ์์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ฌ๋์ ์ N๊ณผ ํํฐ์ ์ M์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค์๋ ์ด์ผ๊ธฐ์ ์ง์ค์ ์๋ ์ฌ๋์ ์์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์ง์ค์ ์๋ ์ฌ๋์ ์๊ฐ ๋จผ์ ์ฃผ์ด์ง๊ณ ๊ทธ ๊ฐ์๋งํผ ์ฌ๋๋ค์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์ฌ๋๋ค์ ๋ฒํธ๋ 1๋ถํฐ N๊น์ง์ ์๋ก ์ฃผ์ด์ง๋ค.
์ ์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์๋ ๊ฐ ํํฐ๋ง๋ค ์ค๋ ์ฌ๋์ ์์ ๋ฒํธ๊ฐ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฃผ์ด์ง๋ค.
N, M์ 50 ์ดํ์ ์์ฐ์์ด๊ณ , ์ง์ค์ ์๋ ์ฌ๋์ ์๋ 0 ์ด์ 50 ์ดํ์ ์ ์, ๊ฐ ํํฐ๋ง๋ค ์ค๋ ์ฌ๋์ ์๋ 1 ์ด์ 50 ์ดํ์ ์ ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ฌธ์ ์ ์ ๋ต์ ์ถ๋ ฅํ๋ค.
์์
์กฐ๊ฑด
- ์๊ฐ ์ ํ: 2์ด
- ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
๐ ๋ณธ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด์๋ ๋จผ์ Union Find์ ๋ํด์ ์์์ผ ํ๋ค.
- Union: ๋ ธ๋๋ค์ ํฉ์น๊ณ
- Find: ๋ถ๋ชจ ๋ ธ๋๋ฅผ ์ฐพ์
- Disjoint Set: ์๋ก์ ์งํฉ(=๋ถ๋ฆฌ ์งํฉ)์ ์ฐพ์๋ด๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์ด๋ฅผ ์ํด์๋,
1. ๋ถ๋ชจ ๋ ธ๋๋ฅผ ์ฐพ์ ๋๊น์ง find(x) ํจ์๋ฅผ ์ฌ๊ท ํธ์ถํ๋ค.
2. union(a,b) ํจ์๋ฅผ ํตํด ๋ ์์์ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ์ฐพ๊ณ , ๋ ์ค ๋ ํฐ ๋ฒํธ๋ฅผ ์์ ๋ฒํธ๋ก ๋ณ๊ฒฝํด์ค๋ค.
3. ๊ฐ ๋ ธ๋๋ณ ๋ถ๋ชจ ๋ ธ๋์ ๋ฒํธ๋ฅผ ์ ์ฅํ, ๋ถ๋ชจ ํ ์ด๋ธ์ ๊ฐ์ง๊ณ ์๋๋ค.
๋ผ๋ ์กฐ๊ฑด์ด ์ฑ๋ฆฝํด์ผํ๋ค!
- ๋ง์ฝ์ A์ B, B์ C๊ฐ ์น๊ตฌ๊ด๊ณ๋ผ๊ณ ๊ฐ์ ํด๋ณด์.
- ๊ทธ๋ ๋ค๋ฉด ์์ฐ์ค๋ฝ๊ฒ A์ C๋ ์น๊ตฌ๊ฐ ๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ๋ค๋ฅธ ๋ ์ง๋จ์ B๋ผ๋ ์ฌ๋์ ํตํด์ ์ฐ๊ฒฐ๋์ด ํ๋์ ๊ทธ๋ฃน์ด ๋๋ค!
- ์ด๋ฒ์๋ A์ B, C์ D๊ฐ ์น๊ตฌ๊ด๊ณ๋ผ๊ณ ๊ฐ์ ํด๋ณด์. ํ์ฌ๋ ๋ ๊ทธ๋ฃน ๋ชจ๋ ์ํ ์ฌ๋์ด ์๊ธฐ์, ์๋ก ์ ํ ๋ชจ๋ฅด๋ ๊ทธ๋ฃน์ด ๋๋ค.
- ํ์ง๋ง ํ์ B์ D๊ฐ ์น๊ตฌ๋ฅผ ๋งบ๊ฒ ๋๋ค๋ฉด, ๋ ๊ทธ๋ฃน์ด ์ฐ๊ฒฐ๋์ด ๊ฒฐ๊ตญ A,B,C,D๋ ๋ชจ๋ ํ ๊ทธ๋ฃน์ ์ํ๊ฒ ๋๋ค.
- ์ด๋ ๋ฏ ํ์ ๋ฐ์๋๋ ์๋ก์ด ๊ด๊ณ๋ค๋ก ์ธํด์ ์ธ์ ๋ ์ง ๊ทธ๋ฃน์ด ๋ณ๊ฒฝ๋ ์ ์๊ธฐ์, Union Find๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๊ณ์ฑ์ ๊ณ์ํด์ ์ ์ํด์ฃผ๋ ๊ฒ์ด๋ค!
์ฝ๋
import sys
input = sys.stdin.readline
N,M = map(int,input().split())
truth_person = list(map(int,input().split()))[1:]
Know_Truth = 0
parent = [i for i in range(N+1)] # ๋ถ๋ชจ ๋
ธ๋ ํ
์ด๋ธ
for person in truth_person: # ์ง์ค์ ์๋ ์ฌ๋์ ๋ถ๋ชจ ๋
ธ๋๋ฅผ 0์ผ๋ก ์ค์
parent[person] = Know_Truth
# Union Find
def find(x):
if parent[x] != x: # ๋ถ๋ชจ ๋
ธ๋๋ฅผ ์ฐพ์ ๋๊น์ง ์ฌ๊ท
parent[x] = find(parent[x])
return parent[x]
def union(a,b):
# ๋ ๋
ธ๋์ ๋ถ๋ชจ ๋
ธ๋๋ฅผ ์ฐพ์์ค
a = find(a)
b = find(b)
# ๋น๊ตํ์ฌ ๋ ์์ ์ซ์์ ๋ถ๋ชจ ๋
ธ๋๋ก ๋ณ๊ฒฝ
if a < b:
parent[b] = a
else:
parent[a] = b
# ํํฐ์ ์ฐธ์ํ ์ฌ๋๋ค์ 2๋ช
์ฉ unionํ๋ ๊ณผ์
parties = []
for _ in range(M):
party = list(map(int,input().split()))[1:]
for i in range(len(party)-1):
union(party[i],party[i+1])
parties.append(party)
# ๊ฐ ํํฐ๋ณ๋ก ์ง์ค์ ์๋ ์ฌ๋์ ๋ถ๋ชจ ๋
ธ๋๋ก ๊ฐ๊ณ ์๋์ง ํ์ธ
cnt = 0
for party in parties:
Know = False
for person in party:
# ์ง์ค์ ์๋ ๊ทธ๋ฃน์ ์ํด ์๋ ๊ฒฝ์ฐ (= ๋ถ๋ชจ ๋
ธ๋๊ฐ 0)
if find(person) == Know_Truth:
Know = True
break
if not Know:
cnt += 1
print(cnt)
- ์ด ๋ฌธ์ ์์๋, ์ง์ค์ ์๋ ์ฌ๋์ ๋ถ๋ชจ ๋ ธ๋๋ฅผ 0์ผ๋ก ์ค์ ํด์ฃผ์ด ํ๋ณํ๋ค.
find
ํจ์๋ ๋ณธ์ธ์ด ๋ถ๋ชจ ๋ ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ, ๊ณ์ํด์ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ ์ฌ๊ท ํธ์ถํ๋ค.
union
ํจ์๋ ๋ ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ๋น๊ตํ์ฌ, ๋ ์์ ์ซ์๋ก ๋ณ๊ฒฝํด์ค๋ค. ์ด๋ ๊ฒ ํด์ผ ํ ๊ทธ๋ฃน ๋ด์์์ ์์ ๋ ธ๋๋ค์ด ๋ชจ๋ ํ๋์ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ์ต์ข ์ ์ผ๋ก ๊ฐ๋ฆฌํฌ ์ ์๋ค.
- ๊ฐ ํํฐ๋ณ๋ก ์์ฐจ์ ์ผ๋ก ๋ ์ฌ๋์ฉ
union
ํจ์๋ฅผ ์คํํ์ฌ, ๊ทธ๋ฃน์ ์์ฑํด์ค๋ค.
- ๊ฐ ํํฐ๋ค์ ๋ค์ ํ์ํ๋ฉฐ, ์ง์ค์ ์๋ ์ฌ๋์ด ์ํด ์๋์ง ํ์ธํ๋ค.
์ฆ, ๋ถ๋ชจ ๋ ธ๋๊ฐ 0์ธ ์ฌ๋์ด ๊ทธ๋ฃน ๋ด์ ์ํด ์์ผ๋ฉด ๊ทธ ์์์๋ ์ง์ค๋ง์ ๋งํ ์ ๋ฐ์ ์์ผ๋ฏ๋ก ์นด์ดํธํ ์ ์๋ค.
๋ง์ฝ ์ง์ค์ ์๋ ์ฌ๋์ด ์๋ ๊ทธ๋ฃน์ด๋ผ๋ฉด, ๊ฑฐ์ง๋ง์ ํ ์ ์๊ธฐ์ cnt += 1
์ ํด์ค๋ค.
๋๋ ์ & ๋ฐฐ์ด ์
์ ๋์จ ํ์ธ๋๋ผ๋ ์๋ก์ด ์๊ณ ๋ฆฌ์ฆ์ ๊ณต๋ถํ ์ ์์ด์ ์ ์ตํ ์๊ฐ์ด์๋ค! ์ฒ์์๋ ์ดํดํ๊ธฐ๊ฐ ๊ฝค๋ ์ด๋ ค์ ๋๋ฐ.. ํ๊ณ ๋๋ ์๊ฐ๋ณด๋ค ๊ฐ๋จํ ์๋ฆฌ์ธ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ํ์ ์ฐ๊ฒฐ์ฑ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๋ ๋ ๋ฒจ์ด ์ฌ๋ผ๊ฐ๋ ์์ฃผ ๋์ฌ ๋ฏ ํ๋, ์ ๋์จ ํ์ธ๋ ๋ฌธ์ ๋ฅผ ์ข ๋ ํ์ด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค!