모모카와 열차 운행표

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

요약
각 열차를 운행표 경로대로 시뮬레이션해 중복 방문, 철로 부재, 충돌 중 처음 발생한 문제를 판정하고, 유효한 열차만으로 모든 역의 최소 통과 횟수를 채우는지 확인한다.
난이도

어려움10점 중 8점

유형
시뮬레이션, 구현, 해시맵, 그리디
정답자
아직 제출이 없습니다

문제

넥슨 게임 블루 아카이브(Blue Archive)의 무대가 되는 학원도시 키보토스 내의 모든 열차 운행표는 키보토스 총학생회 소속 행정위원회 교통실장 유라키 모모카의 손을 거치지 않는 것이 없다. 모모카는 매일 명란맛 감자칩을 씹으며 게으름을 피우곤 하지만 모모카 없이는 키보토스 전체 열차가 옴짝달싹 움직이지 못한 채 마비되고 만다!

오늘도 모모카는 눈 깜짝할 새에 열차 운행표를 휘갈겨 만들고서는 소파에 누워 감자칩을 입에 넣으며 농땡이를 피우고 있다. 이제 모모카 아래의 교통관리실 행정원이 모모카표 열차 운행표를 받아 실제로 유효한 운행표인지를 검사하고, 유효하지 않다면 어디가 잘못되었는지를 보고하여야 한다. 만약 운행표의 오류를 잘못 보고한다면 민원이 폭주하거나 열차끼리 대충돌이 일어나는 참사가 발생할 수도 있다! 그러나 모모카와 달리 평범하디 평범한 행정원에게 이러한 검사 작업을 매번 직접 하나하나 비교해 가며 처리하는 건 너무나도 벅찬 일이었다.

불쌍한 행정원과 키보토스의 원활한 교통을 위해 모모카의 열차 운행표가 유효한지 검증하고, 유효하지 않다면 어디가 잘못되었는지 알려주는 프로그램을 작성해 보자. 어른인 당신의 힘이 필요하다!

모모카의 열차 운행표가 유효하기 위해서는 다음 조건을 만족해야 한다.

  • 열차 운행표대로 열차를 운행하였을 때

    1. 모든 열차가 주어진 철로를 통해 이동할 수 있어야 한다.
    2. 모든 기차역에 최소 통과 요구 횟수 이상의 열차가 지나야 한다.
    3. 동시에 두 대 이상의 열차가 한 역에 도착하거나 정차하여서는 안 된다.
    4. 한 열차가 같은 역을 두 번 이상 지나서는 안 된다.

모모카의 열차 운행표대로 열차를 운행한다고 가정할 때 각 열차의 움직임은 다음과 같다.

  1. 열차 운행표대로 열차 CC가 AA역에서 BB역으로 이동해야 할 때, AA역과 BB역을 잇는 철로 UU가 존재한다면, 열차 CC는 철로 UU를 따라 AA역에서 BB역으로 이동한다.
  2. 열차 운행표대로 열차 CC가 AA역에서 BB역으로 이동해야 할 때, AA역과 BB역을 잇는 철로 UU가 존재하지 않는다면, 열차 CC는 AA역에서 무기한 정차한다.
  3. 열차 운행표대로 열차 CC가 AA역에서 BB역으로 이동해야 할 때, 열차 CC가 BB역을 이미 방문한 상태라도 열차 CC는 BB역으로 이동한다.
  4. 열차 운행표대로 열차 CC가 AA역에서 BB역으로 이동해야 할 때, BB역으로 동시에 진입하는 다른 열차가 존재하거나 이미 BB역에 무기한 정차 중인 다른 열차가 존재한다면, 충돌이 발생한다. 충돌 이후 열차 CC는 BB역에 무기한 정차 중인 것으로 간주한다.
  5. 열차 운행표대로 열차 CC가 기점 AA역에서 출발하고자 할 때, 열차 CC는 차고지에서 시간 ll에 AA역으로 진입한다. 만약 AA역에 동시에 진입하는 다른 열차가 존재하거나 이미 AA역에 무기한 정차 중인 다른 열차가 존재한다면, 충돌이 발생한다. 충돌 이후 열차 CC는 AA역에 무기한 정차 중인 것으로 간주한다.
  6. 열차 운행표대로 열차 CC가 종점 BB역을 무사히 충돌 없이 방문하게 될 경우, 열차 CC는 BB역을 방문한 후 BB역을 비우고 차고지로 들어간다.

만약 열차가 열차 운행표대로 기점부터 종점까지 역들을 중복 없이 무사히 방문하고 차고지로 들어갈 수 없으면, 해당 열차의 노선은 유효하지 않은 것이다.

입력

첫째 줄에 키보토스 내의 기차역의 개수 NN, 기차역 사이를 잇는 철로의 개수 MM, 열차의 개수 TT가 공백으로 구분되어 주어진다. (2≤N≤100,000;(2 \le N \le 100\\,000; 1≤M≤500,000;1 \le M \le 500\\,000; 1≤T≤100,000)1 \le T \le 100\\,000)

둘째 줄에 각 기차역의 최소 통과 요구 횟수 p_1,p_2,⋯ ,p_Np\_1, p\_2, \cdots, p\_N이 공백으로 구분되어 주어진다. (0≤p_i≤T)\left(0 \le p\_i \le T\right)

다음 줄부터 MM개의 줄에 걸쳐 철로의 정보 u_iu\_i, v_iv\_i, t_it\_i가 공백으로 구분되어 주어진다. 이는 통과하는 데 t_it\_i만큼의 시간이 걸리는, 기차역 u_iu\_i와 v_iv\_i를 잇는 양방향 철로가 존재한다는 뜻이다. 두 역을 잇는 철로는 최대 11개이다. (1≤u_i,v_i≤N;(1 \le u\_i,v\_i \le N; u_i≠v_i;u\_i \neq v\_i; 1≤t_i≤100,000)1 \le t\_i \le 100\\,000)

이어서 TT개의 줄에 걸쳐 전체 열차 운행표가 주어진다. 그중 ii번째 줄에는 ii번째 열차의 운행 경로 k_ik\_i, l_il\_i, s_i,1s\_{i,1}, s_i,2s\_{i,2}, ⋯\cdots, s_i,ks\_{i,k}가 공백으로 구분되어 주어진다. 이는 ii번째 열차는 총 k_ik\_i개의 역을 지나게 되며, 시간 l_il\_i에 s_i,1s\_{i,1}을 기점으로 출발하여 순서대로 s_i,2s\_{i,2}, ⋯\cdots, s_i,k−1s\_{i,k-1}를 거쳐 s_i,ks\_{i,k}를 종점으로 도착하게 될 것이라는 뜻이다. (2≤k_i≤10,000;(2 \le k\_i \le 10\\,000; 0≤l_i≤100,000;0 \le l\_i \le 100\\,000; 1≤s_i,j≤N)1 \le s\_{i,j} \le N)

모든 k_ik\_i의 합은 500,000500\\,000을 넘지 않으며, 입력으로 주어지는 모든 수는 정수이다.

출력

첫째 줄에 열차 운행표에서 유효한 열차 노선의 개수를 출력한다.

다음 TT개의 줄에 걸쳐 열차 운행표에 적힌 각 열차의 노선이 유효하면 YES를 출력한다. 유효하지 않다면 각 열차가 처음으로 마주하게 되는 문제를 출력한다. 그 문제가 같은 역을 중복으로 방문하게 되는 경우라면 NO: Duplicate Visit을, 존재하지 않는 철로로 이동해야 하는 경우라면 NO: Edge Absence를, 다른 열차와 충돌하게 되는 경우라면 NO: Collision을 출력한다. 중복 방문과 충돌이 동시에 발생하는 경우 중복 방문을 우선시하여 출력한다.

다음 T+2T+2번째 줄에 유효한 열차 노선만을 운행하였을 때 모든 역의 각 최소 통과 요구 횟수를 충족시킬 수 있다면 filled를, 그렇지 않다면 unfilled를 출력한다.

예제2

  1. 예제 1

    입력
    5 6 4
    1 1 1 0 0
    1 2 1
    1 3 4
    2 4 2
    2 5 6
    3 5 3
    4 5 2
    3 0 2 1 3
    4 3 2 5 3 1
    4 1 4 5 3 2
    3 2 1 2 4
    
    예상 출력
    1
    YES
    NO: Collision
    NO: Edge Absence
    NO: Collision
    filled
    
  2. 예제 2

    입력
    5 6 4
    1 2 2 1 1
    1 2 1
    1 3 4
    2 4 2
    2 5 6
    3 5 3
    4 5 2
    4 0 2 1 3 4
    4 3 2 5 3 1
    4 0 5 4 2 3
    4 2 2 1 2 4
    
    예상 출력
    0
    NO: Edge Absence
    NO: Collision
    NO: Collision
    NO: Duplicate Visit
    unfilled