만드는 중입니다

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

사전순으로 가장 작은 경로

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

요약
S에서 T로 가는 길이가 10^100 이하인 모든 워크 중 색 수열이 사전순으로 가장 작은 것을 찾고, 불가능하거나 10^6을 넘으면 해당 문구를 출력한다.
난이도

어려움10점 중 8점

유형
그래프, 그리디, BFS, 구현
정답자
아직 제출이 없습니다

문제

NN개의 정점과 MM개의 간선으로 이루어진 방향 그래프 GG가 있다. 각 정점에는 11부터 NN까지의 번호가, 각 간선에는 11부터 MM까지의 번호가 붙어 있다. 각 ii (1≤i≤M1 \le i \le M)에 대해, 간선 ii는 정점 u_iu\_i에서 정점 v_iv\_i로 향하며 고유한 색 c_ic\_i를 가진다.

경로(walk)는 간선의 나열 e_1,e_2,⋯ ,e_le\_1, e\_2, \cdots, e\_{l}로서, 각 1≤k<l1 \le k < l에 대해 v_e_kv\_{e\_k}(간선 e_ke\_k의 끝)가 u_e_k+1u\_{e\_{k+1}}(간선 e_k+1e\_{k+1}의 시작)과 같다. 경로 e_1,e_2,⋯ ,e_le\_1, e\_2, \cdots, e\_l은 정점 u_e_1u\_{e\_1}에서 시작해 정점 v_e_lv\_{e\_l}에서 끝난다고 말한다. 같은 간선이 경로에 여러 번 나타날 수 있다.

경로 e_1,e_2,⋯ ,e_le\_1, e\_2, \cdots, e\_l의 색 수열은 c_e_1,c_e_2,⋯ ,c_e_lc\_{e\_1}, c\_{e\_2}, \cdots, c\_{e\_l}로 정의한다.

GG에서 정점 SS에서 정점 TT로 가는, 길이가 1010010^{100} 이하인 모든 경로의 색 수열을 생각하자. 그중 사전순으로 가장 작은 수열을 찾는 프로그램을 작성하시오.

입력

첫째 줄에 네 정수 NN, MM, SS, TT가 공백으로 구분되어 주어진다 (1≤N≤100 0001 \le N \le 100\,000, 0≤M≤300 0000 \le M \le 300\,000, 1≤S≤N1 \le S \le N, 1≤T≤N1 \le T \le N, S≠TS \neq T).

이어서 MM개의 줄이 주어진다. ii (1≤i≤M1 \le i \le M)번째 줄에는 세 정수 u_iu\_i, v_iv\_i, c_ic\_i가 공백으로 구분되어 주어진다 (1≤u_i,v_i≤N1 \le u\_i, v\_i \le N, u_i≠v_iu\_i \neq v\_i, 1≤c_i≤1091 \le c\_i \le 10^{9}). 이는 정점 u_iu\_i에서 정점 v_iv\_i로 향하는 색 c_ic\_i의 간선을 나타낸다.

그래프에는 중복 간선이나 자기 자신으로 향하는 간선이 없으며, 각 간선은 고유한 색을 가진다. 즉, 임의의 1≤i<j≤M1 \le i < j \le M에 대해 c_i≠c_jc\_i \neq c\_j이고 (u_i, v_i)≠(u_j, v_j)(u\_i,\ v\_i) \neq (u\_j,\ v\_j)이다.

출력

정점 SS에서 정점 TT로 가는 경로가 없으면 "IMPOSSIBLE"을 출력한다. (따옴표 제외)

그렇지 않다면, a_1,a_2,⋯ ,a_la\_1, a\_2, \cdots, a\_l을 정점 SS에서 정점 TT로 가는, 길이가 1010010^{100} 이하인 모든 경로의 색 수열 중 사전순으로 가장 작은 수열이라 하자.

  • l≤106l \le 10^{6}이면 첫째 줄에 a_1,a_2,⋯ ,a_la\_1, a\_2, \cdots, a\_l을 출력한다. 각 정수 사이에는 공백을 하나 둔다.
  • l>106l > 10^{6}이면 "TOO LONG"을 출력한다. (따옴표 제외)

힌트

수열 p_1,p_2,⋯ ,p_np\_1, p\_2, \cdots, p\_{n}이 다른 수열 q_1,q_2,⋯ ,q_mq\_1, q\_2, \cdots, q\_{m}보다 사전순으로 작다는 것은 다음 중 하나가 성립한다는 뜻이다:

  • p_1=q_1p\_1 = q\_1, p_2=q_2p\_2 = q\_2, ⋯\cdots, p_j=q_jp\_{j} = q\_{j}이고 p_j+1<q_j+1p\_{j+1} < q\_{j+1}인 jj (0≤j<min⁡(n,m)0 \le j < \min(n, m))가 유일하게 존재한다.
  • n<mn < m이고 p_1=q_1p\_1 = q\_1, p_2=q_2p\_2 = q\_2, ⋯\cdots, p_n=q_np\_n = q\_n이다. 즉, pp가 qq의 진부분 접두사이다.

예제3

  1. 예제 1

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

    입력
    3 4 1 3
    1 2 1
    2 1 2
    2 3 7
    1 3 5
    
    예상 출력
    TOO LONG
    
  3. 예제 3

    입력
    2 0 2 1
    
    예상 출력
    IMPOSSIBLE