728x90
๋ฌธ์
ํ์ด
์ฌ์ดํด์ ํ๋ณํ๋ ๋ฌธ์ ์ด๋ค.
1. ๋ฌธ์ ์์ ์ฃผ์ด์ง ๋ฐฐ์ด์ parent ๋ฐฐ์ด์ด๋ผ ํ์.
2. ์ฌ์ดํด์ ํ๋ณํ๊ธฐ ์ํด ์ด๋๊น์ง ๋ฐฉ๋ฌธํ ๋ ธ๋๋ฅผ cycle ๋ฐฐ์ด์ ์ ์ฅ,
๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ์ํด visited ๋ฐฐ์ด์ ์์ฑ
3. 1๋ฒ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ์ ๋
4. 1๋ฒ ๋ ธ๋์ ์ฐ๊ฒฐ๋ 3๋ฒ ๋ ธ๋ ๋ฐฉ๋ฌธ
๊ฐ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ณ , ๊ทธ ๋ ธ๋์ ์ด์ด์ง ๋ ธ๋๋ฅผ ๊ณ์ ๋ฐฉ๋ฌธํ๋ค.
๋ง์ฝ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋ ธ๋์ด๊ณ ์ฌ์ดํด ๋ฐฐ์ด์ ํด๋น ๋ ธ๋๊ฐ ์กด์ฌํ๋ฉด ์ฌ์ดํด์ด ํ์ฑ๋์๋ค๋ ๊ฒ์ด๋ค.
์ ๊ณผ์ ์ ์ง์ ํด๋ณด๋ฉด ์ดํด๊ฐ ์ฝ๋ค.
์ฝ๋
import sys
sys.setrecursionlimit(10**7)
input = sys.stdin.readline
def dfs(st):
global team
visited[st] = True
cycle.append(st)
next = parent[st]
if visited[next]:
if next in cycle:
team += len(cycle[cycle.index(next):])
return
dfs(next)
t = int(input())
for _ in range(t):
n = int(input())
parent = [0] + list(map(int, input().split()))
visited = [False] * (n + 1)
team = 0
for i in range(1, n + 1):
if not visited[i]:
cycle = []
dfs(i)
print(n - team)
๋ง๋ฌด๋ฆฌ
์ฝ์งํ๋ค๊ฐ ๋์ ํ ๋ชจ๋ฅด๊ฒ ์ด์ ๊ตฌ๊ธ๋ง ํ๋ค..
์ฌ์ดํด ํ๋ณ... ์ด๋ ต๋ค.
์ดํด๋ ํ์ง๋ง ์์ ํ ๋ด ๊ฑธ๋ก ๋ง๋ค์ง ๋ชปํ๋ค.
728x90