[Silver III] 10451 - μμ΄ μ¬μ΄ν΄
λ¬Έμ

1λΆν° NκΉμ§ μ μ Nκ°λ‘ μ΄λ£¨μ΄μ§ μμ΄μ λνλ΄λ λ°©λ²μ μ¬λ¬ κ°μ§κ° μλ€. μλ₯Ό λ€μ΄, 8κ°μ μλ‘ μ΄λ£¨μ΄μ§ μμ΄ (3, 2, 7, 8, 1, 4, 5, 6)μ λ°°μ΄μ μ΄μ©ν΄ νννλ©΄
μ κ°λ€. λλ, Figure 1κ³Ό κ°μ΄ λ°©ν₯ κ·Έλνλ‘ λνλΌ μλ μλ€.μμ΄μ λ°°μ΄μ μ΄μ©ν΄ λ‘ λνλλ€λ©΄, iμμ Οiλ‘ κ°μ μ μ΄μ΄ κ·Έλνλ‘ λ§λ€ μ μλ€.
Figure 1μ λμμλ κ² μ²λΌ, μμ΄ κ·Έλν (3, 2, 7, 8, 1, 4, 5, 6) μλ μ΄ 3κ°μ μ¬μ΄ν΄μ΄ μλ€. μ΄λ¬ν μ¬μ΄ν΄μ "μμ΄ μ¬μ΄ν΄" μ΄λΌκ³ νλ€.
Nκ°μ μ μλ‘ μ΄λ£¨μ΄μ§ μμ΄μ΄ μ£Όμ΄μ‘μ λ, μμ΄ μ¬μ΄ν΄μ κ°μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
첫째 μ€μ ν μ€νΈ μΌμ΄μ€μ κ°μ Tκ° μ£Όμ΄μ§λ€. κ° ν μ€νΈ μΌμ΄μ€μ 첫째 μ€μλ μμ΄μ ν¬κΈ° N (2 β€ N β€ 1,000)μ΄ μ£Όμ΄μ§λ€. λμ§Έ μ€μλ μμ΄μ΄ μ£Όμ΄μ§λ©°, κ° μ μλ 곡백μΌλ‘ ꡬλΆλμ΄ μλ€.
μΆλ ₯
κ° ν μ€νΈ μΌμ΄μ€λ§λ€, μ λ ₯μΌλ‘ μ£Όμ΄μ§ μμ΄μ μ‘΄μ¬νλ μμ΄ μ¬μ΄ν΄μ κ°μλ₯Ό μΆλ ₯νλ€.
μμ μ λ ₯ 1
2
8
3 2 7 8 1 4 5 6
10
2 1 3 4 5 6 7 9 10 8
μμ μΆλ ₯ 1
3
7
# νμ΄ λ°©λ²
μμ΄, μ‘°ν© μ΄λ° μκΈ°κ° λμκΈ° λλ¬Έμ dfsλ‘ μ κ·Όνλ€
κ΅μ¬μμ νμλ μμ΄μ€ν¬λ¦Ό κ°μμ λμΌνλ° κ·Έ κ²½μ°λ μ’νμκ³ μ΄ κ²½μ°λ μ’νκ° μλλ€.
dfsλ₯Ό κΈ°μ‘΄κ³Ό λ€λ₯΄κ² μ μνλλ μ‘°κΈ ν·κ°λ Έλ€
κ΅³μ΄ κ·Έλνλ₯Ό κΌ μ μνμ§ μκ³ λ permutation μμμ ν΄κ²°μ΄ κ°λ₯νꡬλ
# μ½λ
볡μ΅ver: κ΅³μ΄ permκΉμ§ μΈμλ‘ κ±΄λ€μ€ νμλ μμλ€
# 2024-04-18 11:55-12:05
import sys
sys.stdin = open("input.txt","r")
T = int(sys.stdin.readline().strip())
def dfs(curr, visited):
visited[curr] = True
next = perm[curr]
if not visited[next]:
dfs(next, visited)
for _ in range(T):
N = int(sys.stdin.readline().strip())
perm = [0] + list(map(int,sys.stdin.readline().split()))
visited = [False] * (N+1)
cnt = 0
for i in range(1, N+1):
if not visited[i]:
dfs(i, visited)
cnt+= 1
print(cnt)
import sys
sys.stdin = open("input.txt", "r")
def dfs(graph, v, visited):
visited[v] = True
next_v = graph[v]
if not visited[next_v]:
dfs(graph, next_v, visited)
T = int(sys.stdin.readline().strip())
for _ in range(T):
N = int(sys.stdin.readline().strip())
perm = [0] + list(map(int, sys.stdin.readline().split()))
visited = [False] * (N + 1)
cnt = 0
for i in range(1, N + 1):
if not visited[i]:
cnt += 1
dfs(perm, i, visited)
print(cnt)
## μ€λ₯ν΄κ²°
import sys
sys.stdin = open("input.txt", "r")
def dfs(graph, v, visited):
visited[v] = True
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
T = int(sys.stdin.readline().strip())
for _ in range(T):
N = int(sys.stdin.readline().strip())
perm = list(map(int, sys.stdin.readline().split()))
graph = [[] for _ in range(N + 1)]
for i in range(N):
graph[i+1].append(perm[i])
if i + 1 != perm[i]:
graph[perm[i]].append(i+1)
visited = [False] * (N + 1)
cnt = 0
for i in range(1, N + 1):
if not visited[i]:
cnt += 1
dfs(graph, i, visited)
print(cnt)
μ... graph리μ€νΈλ₯Ό κ΅³μ΄ μ μ₯ν νμκ° μμλ€
perm λ°°μ΄λ§ μμΌλ©΄ μ΄λ―Έ μ°κ²° μ λ³΄κ° λ€ μλ κ²μ΄κΈ° λλ¬Έ