- Algorithm
순열이 주어졌을 때, 존재하는 사이클의 수를 출력하는 문제이다.
문제에서 주어지는 순열 순서대로 graph에 넣어주면 [[3], [2], [7], [8], [1], [4], [5], [6]] 와 같은 그래프가 만들어진다.
우리는 존재하는 사이클의 수를 알고 싶기 때문에, bfs를 돌면서 모든 그래프를 방문할 때까지 시작점을 달리하여 반복해 주면 된다.
cycle_cnt = 0
while (False in visited):
start_p = visited.index(False)
bfs(graph,start_p,visited)
cycle_cnt+=1
즉, 반복문을 통해 bfs를 돌린후에 visited에 방문하지 않은 배열이 남아있다면, 배열에서 처음으로 False가 나오는 index부터 bfs를 해주면 된다. bfs가 끝나면 한 사이클이 종료된 것이므로 cycle_cnt를 증가시킨다.
- Code
import sys
input = sys.stdin.readline
from collections import deque
def bfs(graph, start, visited):
queue=deque([start])
visited[start] = True
while queue:
v = queue.popleft()
for i in graph[v]:
if not visited[i-1]:
queue.append(i-1)
visited[i-1] = True
t = int(input())
for _ in range(t):
n = int(input())
line = list(map(int,input().split()))
graph = []
visited = [False]*n
for i in range(n):
graph.append([line[i]])
cycle_cnt = 0
while (False in visited):
start_p = visited.index(False)
bfs(graph,start_p,visited)
cycle_cnt+=1
print(cycle_cnt)
'Koala - 15기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[백준/C++] 11660번: 구간 합 구하기 5 (0) | 2024.08.09 |
---|---|
[백준/C++] 1644번: 소수의 연속합 (0) | 2024.08.09 |
[백준/Java] -1158번: 요세푸스문제 (0) | 2024.08.05 |
[백준/Python] 13904번 : 과제 (0) | 2024.08.05 |
[백준/c++] 1417번 : 국회의원 선거 (0) | 2024.08.04 |