import sys from collections import deque input = sys.stdin.readline N,M = map(int,input().split()) graph = [set() for _ in range(N+1)] degree = [0 for _ in range(N+1)] for _ in range(M): pdN,*arr = list(map(int,input().split())) for i in range(pdN-1): x,y = arr[i],arr[i+1] if y not in graph[x]: graph[x].add(y) degree[y] += 1 stack = deque() cnt = 0 result = [] flag = True for i in range(1,N+1): if degree[i]==0: stack.append(i) while cnt<N: if not stack: flag = False break node = stack.popleft() result.append(str(node)) for next_node in graph[node]: degree[next_node] -= 1 if degree[next_node] == 0: stack.append(next_node) cnt += 1 if flag: print('\n'.join(result)) else: print(0)
이 문제와 같은 경우 평범한 위상정렬이다.
여러명의 PD를 통해 앞에서부터, 하나씩 그래프에 SET으로 넣어주었다.
그리고 degree가 0인것들은 최초의 stack에 넣어주고 난뒤에 위상정렬을 구해주면서,
사이클이 발생할 시, 음악프로그램을 구할 수 없는 것이므로, 그때 flag로 분기 처리를 해주었다.
그리고 stack에 나온순서대로 result에 넣어주고 출력을 해주었다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 3665 최종 순위 (0) | 2021.06.06 |
---|---|
[BOJ/백준] 3165 5 (0) | 2021.06.06 |
[BOJ/백준] 1338 알 수 없는 번호 (0) | 2021.06.06 |
[BOJ/백준] 21778 가희와 프로세스 2 (0) | 2021.06.05 |
[BOJ/백준] 21777 리버스 가희와 프로세스 (0) | 2021.06.05 |