아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

사전순 최소 위상 정렬 최대화

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

요약
최대 k개 간선을 DAG에 추가해 사전 순으로 가장 작은 위상 정렬을 최대한 크게 만들고 그 순서와 최소 추가 개수를 출력합니다.
난이도

어려움10점 중 8점

유형
위상 정렬, 그리디, 힙
정답자
아직 제출이 없습니다

문제

수열 a1,a2,…,ana_1, a_2, \dots, a_n이 1부터 nn까지의 정수를 하나도 빠짐없이 한 번씩 담고 있으면 이 수열을 순열이라고 한다.

정점의 순열 a1,a2,…,ana_1, a_2, \dots, a_n이 방향 그래프의 위상 정렬이라는 것은, uu에서 vv로 가는 모든 방향 간선에 대해 순열에서 uu가 vv보다 앞에 온다는 뜻이다.

1≤i<m1 \le i < m인 모든 ii에서 ai=bia_i = b_i이고 am<bma_m < b_m인 mm이 존재하면, 순열 a1,a2,…,ana_1, a_2, \dots, a_n은 순열 b1,b2,…,bnb_1, b_2, \dots, b_n보다 사전순으로 작다.

사이클이 없는 방향 그래프가 주어진다. 이 그래프에 방향 간선을 최대 kk개까지 추가할 수 있고, 추가한 뒤에도 사이클이 없어야 한다. 이렇게 만든 그래프에서 사전순으로 가장 작은 위상 정렬을 TT라고 하자. TT가 사전순으로 가장 커지도록 추가할 간선을 고른다.

입력

첫째 줄에 정수 nn, mm, kk가 주어진다. 차례대로 정점 개수, 원래 그래프의 방향 간선 개수, 추가할 수 있는 방향 간선 개수이다 (1≤n≤100 0001 \le n \le 100\,000, 0≤m,k≤100 0000 \le m, k \le 100\,000).

다음 mm개 줄에는 정수 uiu_i, viv_i가 주어지며, uiu_i에서 viv_i로 가는 방향 간선을 뜻한다 (1≤ui,vi≤n1 \le u_i, v_i \le n). 같은 간선이 여러 번 주어질 수 있다. 주어진 그래프에는 사이클이 없다.

출력

첫째 줄에 위에서 정한 수열 TT를 정수 nn개로 출력한다. 수는 공백 하나로 구분한다.

둘째 줄에 정수 xx를 출력한다. 그래프에 사이클이 없으면서 사전순으로 가장 작은 위상 정렬이 정확히 TT가 되도록 만드는 데 추가해야 하는 방향 간선 개수의 최솟값이다. xx는 항상 kk 이하이다.

예제5

  1. 예제 1

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

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

    입력
    1 0 0
    
    예상 출력
    1
    0
    
  4. 예제 4

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

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