SCC


답안 제출

Points: 16
시간 제한: 2.0s
메모리 제한: 256M

문제 유형
허용된 언어
C, C++, Python

우주 연합은 N개의 행성으로 이루어져 있습니다. 각 행성은 1번부터 N번까지 번호가 매겨져 있습니다.

우주 연합에는 행성 간을 한 방향으로만 이동할 수 있는 일방통행 워프 포탈이 M개 존재합니다.

우주 연합은 효율적인 방어를 위해 서로 워프 포탈을 통해 양방향으로 자유롭게 오갈 수 있는 행성들의 집합을 '네트워크'로 묶으려고 합니다.

즉, 어떤 네트워크 안의 임의의 두 행성 A와 B에 대해, A에서 B로도 갈 수 있고 B에서 A로도 갈 수 있어야 합니다.

(이러한 집합을 그래프 이론에서는 Strongly Connected Component, 줄여서 SCC라고 부릅니다.) https://ko.wikipedia.org/wiki/%EA%B0%95%ED%95%9C_%EC%97%B0%EA%B2%B0_%EC%9A%94%EC%86%8C

연합의 총사령관은 이러한 네트워크들 중 포함된 행성의 개수가 가장 많은 핵심 네트워크를 찾아내고, 그 네트워크에 포함된 행성들의 번호를 알아내고자 합니다.

우주 연합의 포탈 정보가 주어졌을 때, 가장 큰 네트워크에 속한 행성의 개수와 그 행성들의 번호를 오름차순으로 출력하는 프로그램을 작성하시오.

만약 가장 큰 네트워크가 여러 개라면, 포함된 행성의 번호 중 가장 작은 번호가 더 작은 네트워크를 출력합니다.

입력

첫 번째 줄에 행성의 개수 N과 워프 포탈의 개수 M이 공백으로 구분되어 주어진다.

두 번째 줄부터 M개의 줄에 걸쳐 각 워프 포탈의 출발 행성 u와 도착 행성 v가 공백으로 구분되어 주어진다.

이는 u번 행성에서 v번 행성으로 이동하는 일방통행 포탈이 존재함을 의미한다.

출력

첫 번째 줄에 가장 큰 네트워크에 속한 행성의 개수를 출력한다.

두 번째 줄에 해당 네트워크에 속한 행성의 번호들을 공백으로 구분하여 오름차순으로 출력한다.

제약 조건

  • 1 <= N <= 10,000
  • 1 <= M <= 100,000
  • 1 <= u, v <= N
  • 동일한 방향의 포탈이 중복해서 주어지지 않습니다.

예제 입력 1

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

예제 출력 1

3
1 2 3

예제 입력 2

4 4
1 2
2 3
3 4
4 1

예제 출력 2

4
1 2 3 4

예제 입력 3

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

예제 출력 3

1
1

코멘트

현재 작성된 코멘트가 없습니다.