만드는 중입니다

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

최소 최장 여행

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

요약
사이클이 없는 단방향 도로망에서 각 마을마다 가장 긴 여행을 찾고, 길이가 같으면 도로 라벨 순서가 사전순으로 가장 작은 여행을 골라 길이와 라벨의 합을 구합니다.
난이도

보통10점 중 6점

유형
동적 계획법, 위상 정렬, 그래프, 정렬
정답자
아직 제출이 없습니다

문제

베시는 코랜드에서 여행을 떠난다. 코랜드에는 NN개(2≤N≤2⋅1052\le N\le 2\cdot 10^5)의 마을이 1번부터 NN번까지 번호로 있고, MM개(1≤M≤4⋅1051\le M\le 4\cdot 10^5)의 단방향 도로가 있다. ii번째 도로는 마을 a_ia\_i에서 마을 b_ib\_i로 향하며, 라벨은 l_il\_i이다 (1≤a_i,b_i≤N1\le a\_i,b\_i\le N, 1≤l_i≤1091\le l\_i\le 10^9).

마을 x_0x\_0에서 시작하는 길이 kk의 여행은 마을의 수열 x_0,x_1,…,x_kx\_0, x\_1, \ldots, x\_k이며, 모든 0≤i<k0\le i < k에 대해 마을 x_ix\_i에서 x_i+1x\_{i+1}로 가는 도로가 있어야 한다. 코랜드에는 무한히 긴 여행이 없다고 보장된다. 또한 같은 두 마을을 잇는 도로는 두 개 이상 없다.

각 마을에서 시작하는 가장 긴 여행을 구하려고 한다. 출발점에 따라서는 가장 긴 여행이 여러 개일 수 있다. 이때 베시는 도로 라벨의 수열이 사전순으로 가장 작은 여행을 고른다. 길이가 같은 두 수열에서 처음으로 다른 위치의 원소가 더 작은 쪽이 사전순으로 작다.

각 마을에서 시작해 베시가 고르는 여행의 길이와 그 여행 도로 라벨의 합을 출력한다.

입력

첫 줄에 NN과 MM이 주어진다.

이어서 MM개의 줄에 세 정수 a_ia\_i, b_ib\_i, l_il\_i가 주어진다. 이는 마을 a_ia\_i에서 마을 b_ib\_i로 가는 라벨 l_il\_i의 도로를 뜻한다.

출력

NN개의 줄을 출력한다. ii번째 줄에는 마을 ii에서 시작해 베시가 고르는 여행의 길이와 도로 라벨의 합을 공백으로 구분해 출력한다.

예제4

  1. 예제 1

    입력
    4 5
    4 3 10
    4 2 10
    3 1 10
    2 1 10
    4 1 10
    
    예상 출력
    0 0
    1 10
    1 10
    2 20
    
  2. 예제 2

    입력
    4 5
    4 3 4
    4 2 2
    3 1 5
    2 1 10
    4 1 1
    
    예상 출력
    0 0
    1 10
    1 5
    2 12
    
  3. 예제 3

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

    입력
    4 5
    4 3 2
    4 2 2
    3 1 10
    2 1 5
    4 1 1
    
    예상 출력
    0 0
    1 5
    1 10
    2 7