[BOJ] Q9466 텀 프로젝트

Question

Language: Python

Difficulty: Gold 4

해당 문제는 1->2->3->1과 같이 출발점에서 시작한 노드가 다시 출발점으로 돌아오는 사이클을 찾아서, 사이클에 포함되어 있지 않는 학생들의 수를 찾아내는 것이다.

자기 자신으로의 사이클도 존재할 수 있다는 점에서, dfs를 통한 cycle 탐색을 수행하면 된다. 이때, 아래와 같이 cycle이 발생하게 되면, 5번 노드의 경우는 문제의 조건에 의해 사이클에 포함되지 않으므로 제거시켜줘야한다.

q9466

if visited[adj_vertex]:
    if adj_vertex in path:
        visited[vertex]=True
        count+=len(path[path.index(adj_vertex):])
    break
else:
    stack.append((adj_vertex))

Solution

def solution():
    visited=[False] *(num+1)
    count=0
    for start_vertex in range(1,num+1):
        if visited[start_vertex]:
            continue        
        stack=[(start_vertex)]
        path=[]
        while stack:
            vertex=stack.pop(0)
            visited[vertex]=True
            path.append(vertex)
            adj_vertex=edges[vertex]
            if visited[adj_vertex]:
                if adj_vertex in path:
                    visited[vertex]=True
                    count+=len(path[path.index(adj_vertex):])
                break
            else:
                stack.append((adj_vertex))

    return num-count

if __name__ == "__main__":
    test_cases=int(input())
    for _ in range(test_cases):
        num=int(input())
        edges=[0]+list(map(int,input().split())) 
        print(solution())

댓글남기기