아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

끝나지 않는 BFS

시간 제한2초메모리 제한512 MB

요약
방문 표시를 잃어버린 BFS의 과정을 추적한다. 정점 집합이 양분 집합을 번갈아 방문하므로, 두 집합 중 전체 정점 집합과 같은 순간이 나오는지와 그 최소 횟수를 구한다.
난이도

어려움10점 중 8점

유형
그래프, BFS, 구현, 시뮬레이션
정답자
아직 제출이 없습니다

문제

엔도 씨는 무방향 그래프의 모든 정점을 탐색하는 알고리즘인 너비 우선 탐색(BFS)을 구현하려고 했다. BFS의 의사 코드 예시는 다음과 같다.

1: $current \leftarrow \{start\_vertex\}$
2: $visited \leftarrow current$
3: while $visited \ne$ the set of all the vertices
4:   $found \leftarrow \{\}$
5:   for $v$ in $current$
6:     for each $u$ adjacent to $v$
7:       $found \leftarrow found \cup \{u\}$
8:   $current \leftarrow found \setminus visited$
9:   $visited \leftarrow visited \cup found$

그런데 엔도 씨는 코드에서 방문한 정점을 관리하는 부분을 빠뜨린 모양이다. 그가 실제로 작성한 코드는 다음과 같다.

1: $current \leftarrow \{start\_vertex\}$
2: while $current \ne$ the set of all the vertices
3:   $found \leftarrow \{\}$
4:   for $v$ in $current$
5:     for each $u$ adjacent to $v$
6:       $found \leftarrow found \cup \{u\}$
7:   $current \leftarrow found$

어떤 그래프에서는 엔도 씨의 프로그램이 무한히 실행되어 멈추지 않는다는 것을 알 수 있다. 하지만 그렇다고 해서 모든 정점을 유한한 단계 안에 탐색할 수 없는 것은 아니다. 자세한 내용은 아래 예제 2를 참고하라. 여러분의 과제는 엔도 씨에게 버그를 알려주기 위해, 주어진 그래프에 대해 엔도 씨의 프로그램이 유한한 단계 안에 멈추는지 판별하는 프로그램을 작성하는 것이다. 또한 멈춘다면 프로그램이 멈추기 위해 필요한 최소 반복 횟수도 계산하라.

입력

입력은 다음과 같은 형식의 단일 테스트 케이스로 주어진다.

$N$ $M$
$U_{1}$ $V_{1}$
$\vdots$
$U_{M}$ $V_{M}$

첫째 줄에는 두 정수 NN (2≤N≤100,0002 \le N \le 100{,}000)과 MM (1≤M≤100,0001 \le M \le 100{,}000)이 주어진다. NN은 정점의 수, MM은 주어진 무방향 그래프의 간선 수이다. 이어지는 MM개의 줄 중 ii번째 줄에는 두 정수 U_iU\_{i}와 V_iV\_{i} (1≤U_i,V_i≤N1 \le U\_{i}, V\_{i} \le N)가 주어지며, 이는 정점 U_iU\_{i}와 V_iV\_{i}가 인접함을 뜻한다. 정점 1이 시작 정점, 즉 의사 코드의 start_vertexstart\_vertex이다. 주어진 그래프는 다음 조건도 만족한다.

  • 자기 간선이 없다. 즉, 모든 1≤i≤M1 \le i \le M에 대해 U_i≠V_iU\_{i} \ne V\_{i}이다.
  • 중복 간선이 없다. 즉, 모든 1≤i<j≤M1 \le i < j \le M에 대해 {U_i,V_i}≠{U_j,V_j}\{U\_{i}, V\_{i}\} \ne \{U\_{j}, V\_{j}\}이다.
  • 연결 그래프이다. 즉, 모든 정점 1≤U,V≤N1 \le U, V \le N에 대해 UU에서 VV로 가는 경로가 적어도 하나 존재한다(반대 방향도 마찬가지이다).

출력

주어진 입력 그래프에 대해 엔도 씨의 잘못된 BFS 코드가 유한한 단계 안에 멈추지 않는다면 -1을 한 줄에 출력한다. 그렇지 않다면 멈추기 위해 필요한 최소 반복 횟수를 출력한다.

예제4

  1. 예제 1

    입력
    3 3
    1 2
    1 3
    2 3
    
    예상 출력
    2
    
  2. 예제 2

    입력
    4 3
    1 2
    2 3
    3 4
    
    예상 출력
    -1
    
  3. 예제 3

    입력
    4 4
    1 2
    2 3
    3 4
    4 1
    
    예상 출력
    -1
    
  4. 예제 4

    입력
    8 9
    2 1
    3 5
    1 6
    2 5
    3 1
    8 4
    2 7
    7 1
    7 4
    
    예상 출력
    3