Traveling SCCC President 2

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

요약
1번에서 N번으로 가는 경로 중 사용한 도로 길이를 모두 bitwise OR한 값이 최소인 경로를 찾는다.
난이도

보통10점 중 7점

유형
그래프, 최단 경로, 비트 연산, 그리디
정답자
아직 제출이 없습니다

문제

숭실대학교 컴퓨터학부 문제해결 소모임 SCCC의 회장인 상원이는 정보과학관에서 형남공학관으로 이동해 대회 홍보 포스터를 붙이려고 한다.

숭실대학교의 캠퍼스는 11번부터 NN번까지 번호가 붙어 있는 NN개의 건물과, 서로 다른 두 건물을 연결하고 11번부터 MM번까지 번호가 붙어 있는 MM개의 도로로 구성되어 있다. ii번째 도로는 u_iu\_i번 건물과 v_iv\_i번 건물을 연결하고, 이 도로의 길이는 w_iw\_i이다. 두 건물 쌍을 연결하는 도로는 최대 한 개만 존재하며, 모든 건물은 도로를 통해 서로 이동할 수 있다. 정보과학관의 건물 번호는 11번, 형남공학관의 건물 번호는 NN번이다.

일반적인 사람이라면 다른 건물로 이동할 때 사용한 도로 길이의 합 만큼의 시간이 소요되겠지만, 놀랍게도 상원이는 사용한 도로의 길이를 모두 bitwise OR 연산한 값 만큼의 시간이 소요된다. 상원이가 11번 건물에서 NN번 건물로 이동할 때 걸리는 최소 시간을 구해주자.

bitwise OR 연산이 무엇인지 잘 모르는 친구들은 문제 지문 맨 아래에 친절한 정휘가 준비해 놓은 정의를 읽어보도록 하자.

입력

첫째 줄에 건물의 개수 NN과 도로의 개수 MM이 공백으로 구분되어 주어진다.

둘째 줄부터 MM개의 줄에 걸쳐, ii번 도로가 연결하는 두 건물의 번호 u_i,v_iu\_i,v\_i와 도로의 길이 w_iw\_i가 한 줄에 하나씩 공백으로 구분되어 주어진다.

출력

상원이가 11번 건물에서 NN번 건물로 이동하는 데 필요한 최소 시간을 출력한다.

제한

  • 2≤N≤300,0002\leq N\leq 300\\, 000
  • N−1≤M≤300,000N-1\leq M\leq 300\\, 000
  • 1≤u_i,v_i≤N1\leq u\_i,v\_i\leq N, u_i≠v_iu\_i\neq v\_i (1≤i≤M)(1\leq i\leq M)
  • 0≤w_i<2600\leq w\_i<2^{60} (1≤i≤M)(1\leq i\leq M)
  • i≠ji\neq j면 (u_i,v_i)≠(u_j,v_j)(u\_i,v\_i)\neq(u\_j,v\_j), (u_i,v_i)≠(v_j,u_j)(u\_i,v\_i)\neq(v\_j,u\_j)이다. 즉, 연결하는 두 건물의 쌍이 같은 도로가 여러 개 존재하지 않는다.
  • 모든 건물은 도로를 통해 이어져 있다.
  • 입력으로 주어지는 수는 모두 정수이다.

힌트

두 정수 A,BA,B를 bitwise OR한 값 A OR BA\text{ OR } B는 다음과 같이 정의된다.

  • 이진법으로 생각했을 때, AA의 2k2^k의 자릿수와 BB의 2k2^k의 자릿수 중 하나 이상이 1이면 A OR BA\text{ OR } B의 2k2^k의 자릿수가 1이고, 둘 다 0이면 A OR BA\text{ OR } B의 2k2^k의 자릿수는 0이다.

예를 들어 12=1100_(2)12=1100\_{(2)}, 10=1010_(2)10=1010\_{(2)}이므로 12 OR 10=1100_(2) OR 1010_(2)=1110_(2)=1412\text{ OR } 10=1100\_{(2)}\text{ OR } 1010\_{(2)}=1110\_{(2)}=14로 계산된다.

kk개의 정수 A_1,A_2,⋯ ,A_kA\_1,A\_2,\cdots ,A\_k를 bitwise OR한 결과는 (…((A_1 OR A_2) OR A_3) OR …) OR A_k(\ldots((A\_1\text{ OR } A\_2)\text{ OR } A\_3)\text{ OR }\ldots)\text{ OR } A\_k로 정의된다. 이 연산의 결과는 A_1,A_2,⋯ ,A_kA\_1,A\_2,\cdots ,A\_k의 순서를 바꾸더라도 변하지 않음을 증명할 수 있다.

도로의 길이와 정답이 32비트 정수 범위를 벗어날 수 있으므로 C/C++에서는 long long 타입, Java에서는 long 타입을 사용하는 것을 권장한다.

입출력 양이 많으므로 문제지 2-4페이지의 언어 가이드에 있는 빠른 입출력을 사용하는 것을 권장한다.

예제2

  1. 예제 1

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

    입력
    2 1
    1 2 1152921504606846975
    
    예상 출력
    1152921504606846975