[BOJ/Python]

문제 소스:https://www.acmicpc.net/problem/2623

쉬운 목차

문제

인터넷 방송 KOI(코리아오픈인터넷)의 음악 프로그램 PD 남일 씨는 음악 KOI 프로그램에서 가수들의 공연 순서를 정하는 데 많은 어려움을 겪었다.

순서를 결정하려면 많은 조건을 고려해야 합니다.

남일은 이날 공연 예정인 가수 6명을 위해 조 PD 3명에게 각 가수의 공연 순서를 정해달라고 부탁했다.

조 PD들이 가지고 온 것은 다음과 같다.

  • 1 4 3
  • 6 2 5 4
  • 2 3

1조 PD는 1번 가수, 4번 가수, 3번 가수 순으로 출연하기로 정했고, 2조 PD는 6번, 2번, 5번, 5번 순으로 자신의 가수를 순서대로 배치했다.

결정된. 한 가수를 담당하는 PD는 여러 명일 수 있다.

마지막으로 세 번째 보조 PD는 2번을 먼저 설정한 다음 3번으로 설정했습니다.

Namil의 임무는 이러한 주문을 수집하고 모든 가수의 주문을 설정하는 것입니다.

남일은 잠시 고민하더니 6 2 1 5 4 3의 순서를 정했다.

이렇게 가수들의 순서가 정해지면 조PD 3인이 정한 순서는 모두 충족된다.

물론 전체 순서를 1 6 2 5 4 3으로 설정해도 괜찮습니다.

경우에 따라 남일이 모든 사람을 만족시키는 주문을 하는 것이 불가능할 수도 있습니다.

예를 들어 3조 PD가 2 3이 아닌 3 2로 순서를 정했다면 남일이 전체 순서를 정하는 것은 불가능하다.

이번에 남일은 우리나라의 월드컵 4강 진출을 기념하는 음악 축제의 PD를 맡게 되는데 가수들이 많다.

이제 조PD들이 가져온 순서를 보고 남일이 가수들의 공연 순서를 정하는 것을 도와주기만 하면 된다.

보조PD의 순서를 입력받아 전체 가수의 순서를 결정하는 프로그램을 작성하시오.

기입

가수 N의 수와 보조 PD의 수 M은 첫 줄에 주어진다.

가수는 숫자 1, 2, … 이며 N으로 표시됩니다.

두 번째 줄부터 각 보조 PD가 지정한 순서가 한 줄에 하나씩 나타납니다.

각 행의 시작 부분에는 PD 조수가 맡은 가수의 번호가 있고 그 뒤에 가수의 순서가 있습니다.

N은 1 이상 1,000 이하의 정수이고, M은 1 이상 100 이하의 정수이다.

누르다

출력은 N 라인으로 구성되며 라인당 하나의 숫자를 출력합니다.

이것은 Namil이 정한 가수들의 연주 순서를 나타냅니다.

답변이 여러 개인 경우 하나를 입력합니다.

Namil이 주문을 할 수 없는 경우 첫 줄에 0이 출력됩니다.

샘플 입력 1

6 3
3 1 4 3
4 6 2 5 4
2 2 3

예제 출력 1

6
2
1
5
4
3

설명

토폴로지 정렬 문제입니다.

노드에 진입하는 Edge의 개수는 0부터 순차적으로 출력됩니다.

예를 들면 다음과 같습니다.


  • 연결된 상태입니다.

  • 여기서 각 노드의 현재 진입 정도(노드에 진입하는 에지의 수)는 1과 6인 경우에만 0이다.

  • 그래서 1과 6을 대기시킵니다.


  • 지금부터 대기열에 노드가 있는 한 반복합니다.

  • 먼저 노드를 대기열에서 뺍니다.


  • 최종 결과의 경우 출력할 노드의 순서(이 문제에서 가수의 등장 순서)를 저장한 목록입니다.

  • 대기열의 항목 1을 최종 결과 목록에 추가합니다.

  • 그리고 노드 1에서 나가는 가장자리를 제거합니다.


  • 노드 1에서 노드 4까지의 에지를 제거하고 노드 4의 진입차수가 0인지 확인합니다.

  • 노드 5에서 노드 4까지의 에지가 있으므로 인도가 0이 아님을 알 수 있습니다.


  • 노드를 대기열에서 빼고 최종 결과 목록에 추가합니다.

  • 추출된 노드에서 나오는 모서리를 제거합니다.


  • 노드 6에서 노드 2까지의 에지가 제거됩니다.

  • 노드 2의 경우 진입도가 0이므로 Queue에 넣는다.


  • 노드를 큐에서 빼고 최종 결과에 추가합니다.

  • 추출된 노드에 연결된 트렁크를 제거합니다.


  • 노드 2에서 노드 3까지 가장자리를 제거합니다.

  • 노드 2에서 노드 5까지 가장자리를 제거합니다.

  • 노드 3의 경우 in-degree가 0이 아니지만, 노드 5의 경우 in-degree가 0이 되므로 queue에 들어갑니다.


  • 노드를 대기열에서 빼고 최종 결과 목록에 추가합니다.

  • 추출된 노드에 연결된 트렁크를 제거합니다.


  • 노드 5에서 노드 4까지 가장자리를 제거합니다.

  • 노드 4는 진입도가 0이므로 대기열에 넣습니다.


  • 대기열에서 노드를 가져와서 최종 결과에 넣습니다.

  • 드래그 중인 노드에서 나오는 가장자리를 제거합니다.


  • 노드 4에서 노드 3까지 가장자리를 제거합니다.

  • 노드 3의 정도가 0이므로 대기열에 넣습니다.


  • 노드를 대기열에서 빼고 최종 결과 목록에 추가합니다.

  • 추출된 노드에 연결된 에지는 없으며 큐에 새 노드가 추가되지 않습니다.


  • 대기열에 더 이상 노드가 없으므로 완료되었습니다.

  • 최종 결과는 1 6 2 5 4 3입니다.

  • 위상정렬의 경우 답은 여러 가지로 나올 수 있는데, 다음 세 가지 조건을 만족하므로 정답이라고 할 수 있다.

  • 1->4->3
  • 6->2->5->3
  • 2->3


  • 문제에서 순서를 결정할 수 없으면 0이 반환됩니다.

  • 순서를 정할 수 없는 경우는 진입도가 0이 될 수 없는 노드가 있는 경우입니다.

  • 최종 결과 목록의 항목 수가 n이 아닌 경우 0을 반환하도록 코드가 작성되었습니다.

  • in-degree가 0이 아닌 노드가 있는 경우 0을 반환하도록 코드를 작성할 수 있습니다.

코드는 다음과 같습니다.

하나
2
4
5
6
7
8일
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
수입 체계
수입 컬렉션
데프 topological_sort(그래프, initude):
결과 = ()
대기줄 = Collections.deque()
~을 위한~ 안에 영역(하나,N+하나):
만약에 학위 (i)==0:
대기줄. 추가(i)
~하는 동안 대기줄:
마디 = 대기줄. 팝레프트()
결과.추가(노드)
~을 위한 다음 ~ 안에 그래픽(노드):
도(다음)=하나
만약에 도(다음)==0:
대기줄. 추가 (다음)
만약에 (결과)!
=N:
돌려 주다 (0)
돌려 주다 결과
엔,엠 = 지도(내부,sys.stdin.readline().split())
=(0 ~을 위한 _ ~ 안에 영역(N+하나))
그래프=(() ~을 위한 _ ~ 안에 영역(N+하나))
~을 위한 _ ~ 안에 영역(중):
리스트 = 목록(지도(내부,sys.stdin.readline().split()))
~을 위한~ 안에 영역(2,(일부)):
inggrad(lst(i))+=하나
그래프(lst(i하나)).append(lst(i))
누르다(*topological_sort(그래프, initude), 9월=‘\N’)
CS