만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

Link-Cut Tree

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

요약
간선 i의 길이가 2^i인 무향 그래프에서 길이 합이 가장 작은 단순 사이클을 찾아 간선 번호를 오름차순으로 출력합니다. 사이클이 없으면 -1을 출력합니다.
난이도

어려움10점 중 8점

유형
그래프, 유니온 파인드, 그리디
정답자
아직 제출이 없습니다

문제

BaoBao는 방금 링크-컷 트리(link-cut tree)라는 자료구조로 그래프에서 사이클을 찾는 방법을 배웠고, 직접 써 보기로 했다. 정점이 nn개, 간선이 mm개인 무방향 그래프가 주어진다. ii번째 간선의 길이는 2i2^i이다. BaoBao는 길이가 가장 짧은 단순 사이클을 찾아야 한다.

단순 사이클은 원래 그래프의 부분 그래프로, kk개(3≤k≤n3 ≤ k ≤ n)의 정점 a1,a2,⋯ ,aka_1, a_2, \cdots, a_k와 kk개의 간선으로 이루어진다. 모든 1≤i≤k1 ≤ i ≤ k에 대해 부분 그래프에 aia_i와 a(i mod k)+1a_{(i \bmod k)+1}을 잇는 간선이 있어야 한다. 사이클의 길이는 사이클에 포함된 간선 길이의 합이다.

입력

첫 줄에 테스트 케이스의 수 TT가 주어진다. 각 테스트 케이스는 다음과 같다.

첫 줄에 원래 그래프의 정점 수 nn과 간선 수 mm(3≤n≤1053 ≤ n ≤ 10^5, 1≤m≤1051 ≤ m ≤ 10^5)이 주어진다.

이어지는 mm개의 줄 중 ii번째 줄에는 길이가 2i2^i인 간선의 양 끝점 uiu_i, viv_i(1≤ui,vi≤n1 ≤ u_i, v_i ≤ n)가 주어진다. 자기 루프와 중복 간선은 없다. 그래프가 연결되어 있지 않을 수도 있다.

모든 테스트 케이스의 nn 합과 mm 합은 각각 10610^6을 넘지 않는다.

출력

각 테스트 케이스마다 한 줄을 출력한다. 단순 사이클이 없으면 -1을 출력한다. 있으면 길이가 가장 짧은 사이클을 이루는 간선의 번호를 오름차순으로 공백으로 구분해 출력한다. 이런 답은 최대 하나뿐임이 알려져 있다.

힌트

첫 번째 테스트 케이스는 아래와 같다. 간선 옆의 숫자는 간선 번호(괄호 밖)와 길이(괄호 안)이다. 길이가 가장 짧은 사이클은 2, 4, 5, 6번 간선으로 이루어지며, 길이는 22+24+25+26=1162^2 + 2^4 + 2^5 + 2^6 = 116이다.

예제1

  1. 예제 1

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