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

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

판다 나라 5: 판다 프로그래밍 언어

시간 제한1초메모리 제한128 MB

요약
함수 호출 순서를 만족하도록 함수 18개 이하를 재배열하되 줄 수로 가중된 이동 비용을 최소화하고, 불가능하면 -1을 출력한다.
난이도

어려움10점 중 8점

유형
동적 계획법, 비트 연산, 위상 정렬, 그리디
정답자
아직 제출이 없습니다

문제

판다 세계에는 프로그래밍 언어가 단 하나뿐이며, 그 이름은 판다 프로그래밍 언어(PPL)이다. PPL은 절차적 언어여서 하나의 프로그램 안에 여러 개의 함수를 정의할 수 있고, 재귀 호출(함수가 자기 자신을 호출하는 것)도 허용된다.

PPL에는 함수 원형(prototype) 선언 기능이 없다. 따라서 모든 함수는 자신을 호출하는 다른 함수보다 먼저 정의되어 있어야 한다. 즉, 함수 AA가 함수 BB를 호출한다면(B≠AB \ne A), 소스 파일에서 BB가 AA보다 위에 있어야 한다.

어떤 프로그램이 이 순서를 고려하지 않고 작성되어, 일부 함수가 자신을 호출하는 함수보다 뒤에 정의되어 있어 컴파일되지 않는다. 당신의 임무는 프로그램이 컴파일되도록 함수들의 순서를 재배치하되, 총 재배치 비용을 최소화하는 것이다.

함수 하나를 옮기는 비용은 그 함수의 줄 수에 건너뛴 줄의 총합을 곱한 값이다. 예를 들어 위에서 아래로 놓인 네 함수 A,B,C,DA, B, C, D의 줄 수가 각각 10,4,6,310, 4, 6, 3이라고 하자. AA를 DD 아래로 옮기면 B,C,DB, C, D를 건너뛰므로 비용은 10×(4+6+3)=13010 \times (4 + 6 + 3) = 130이다. DD를 AA와 BB 사이로 올리면 C,BC, B를 건너뛰므로 비용은 3×(6+4)=303 \times (6 + 4) = 30이다.

프로그램이 컴파일되는 순서로 함수들을 재배치하는 최소 총비용을 구하라. 함수가 자기 자신을 호출하는 것은 허용되므로 자기 참조는 컴파일을 막지 않으며, 서로 다른 두 개 이상의 함수가 이루는 호출 순환이 있을 때에만 컴파일이 불가능하다.

입력

첫 줄에 테스트 케이스의 수 TT가 주어진다.

각 테스트 케이스의 첫 줄에는 함수의 개수 NN (1≤N≤181 \le N \le 18)이 주어진다. 다음 줄에는 NN개의 정수가 주어지며, ii번째 정수 MiM_i (1≤Mi≤1001 \le M_i \le 100)는 함수 ii의 줄 수이다.

이어지는 NN개의 줄은 함수들의 호출 관계를 나타낸다. 그중 ii번째 줄은 정수 CC (0≤C<N0 \le C < N)로 시작하며, 이는 함수 ii가 호출하는 함수의 개수이다. 그 뒤에 함수 ii가 호출하는 함수들을 나타내는 CC개의 정수 FjF_j (1≤Fj≤N1 \le F_j \le N)가 주어진다. 함수는 자기 자신을 포함할 수도 있다(재귀 호출).

각 테스트 케이스의 마지막 줄에는 NN개의 정수가 주어지며, 이는 함수들의 초기 배치 순서(위에서 아래로)를 나타내는 1…N1 \dots N의 순열이다.

출력

각 테스트 케이스마다 프로그램이 컴파일되도록 재배치하는 최소 비용을 한 줄에 출력한다. 유효한 배치가 존재하지 않으면 −1-1을 출력한다.

예제1

  1. 예제 1

    입력
    2
    4
    7 3 12 8
    1 3
    1 4
    2 1 3
    0
    1 2 3 4
    5
    7 3 12 8 4
    3 1 2 4
    0
    1 2
    0
    1 4
    1 2 3 4 5
    
    예상 출력
    -1
    161