Algorithms/Algorithms

μˆœμ—΄ 사이클 (λ°±μ€€ 10451)

탱저 2021. 10. 12. 17:00

https://www.acmicpc.net/problem/10451

 

10451번: μˆœμ—΄ 사이클

1λΆ€ν„° NκΉŒμ§€ μ •μˆ˜ N개둜 이루어진 μˆœμ—΄μ„ λ‚˜νƒ€λ‚΄λŠ” 방법은 μ—¬λŸ¬ κ°€μ§€κ°€ μžˆλ‹€. 예λ₯Ό λ“€μ–΄, 8개의 수둜 이루어진 μˆœμ—΄ (3, 2, 7, 8, 1, 4, 5, 6)을 배열을 μ΄μš©ν•΄ ν‘œν˜„ν•˜λ©΄ \(\begin{pmatrix} 1 & 2 &3&4&5&6&7&8 \\  3

www.acmicpc.net


μ²˜μŒμ— κ·Έλž˜ν”„λ₯Ό λ§Œλ“€μ–΄μ„œ μž¬κ·€λ₯Ό ν–ˆλŠ”λ° μ‹œκ°„ μ œν•œμœΌλ‘œ μ‹€νŒ¨!

 

μ‹€νŒ¨ν•œ μ½”λ“œ

import sys
sys.setrecursionlimit(1000000)
input = sys.stdin.readline

t = int(input())

def dfs(v):
    visited[v] = 1 
    for i in range(n + 1):
        if visited[i] == 0 and graph[v][i] == 1:
            dfs(i)

for i in range(t):
    n = int(input())
    visited = [0 for j in range(n + 1)]
    graph = [[0 for k in range(n + 1)] for m in range(n + 1)]
    m = list(map(int, input().split()))
    
    for a, b in enumerate(m):
        graph[a + 1][b] = 1
        graph[b][a + 1] = 1
    
    cnt = 0
    for j in range(1, n + 1):
        if visited[j] == 0:
            dfs(j)
            cnt += 1
    print(cnt)

일차원 λ°°μ—΄λ‘œ μ‰½κ²Œ ν•΄κ²°ν•˜κΈ°

import sys
sys.setrecursionlimit(1000000)
input = sys.stdin.readline

t = int(input())

def dfs(v):
    visited[v] = 1 
    next = m[v]
    if visited[next] == 0:
        dfs(next)

for i in range(t):
    n = int(input())
    visited = [0] * (n + 1)
    m = [0] + list(map(int, input().split()))
    
    cnt = 0
    for j in range(1, n + 1):
        if visited[j] == 0:
            dfs(j)
            cnt += 1
    print(cnt)

m = [0] + list(map(int, input().split()))

python 리슀트 λ”ν•˜κΈ°,,, 기본적인 것 κΉŒλ¨Ήμ§€ 말기,,,

728x90