만드는 중입니다

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

최적의 알파-베타 가지치기

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

요약
게임 트리의 리프 값이 주어졌을 때, 자식 노드의 순서를 바꿔 가며 알파-베타 가지치기가 평가하는 리프 수의 최솟값과 최댓값을 구합니다.
난이도

보통10점 중 7점

유형
트리, 최소 신장 트리, 동적 계획법
정답자
아직 제출이 없습니다

문제

Ciel 여우는 어떤 게임을 위한 인공지능을 만들고 있다. 이 게임은 정점이 nn개인 게임 트리 TT로 표현된다. 각 노드는 상황이 얼마나 좋은지를 나타내는 평가값을 가진다. 리프가 아닌 노드의 값은 자식 노드들 값의 최댓값에 −1-1을 곱한 것이다. 리프의 값은 계산 비용이 큰 Ciel의 특수한 함수로 구한다. 그래서 Ciel은 알파-베타 가지치기로 루트의 평가값을 구하면서, 계산하는 리프 노드 수를 줄인다.

자식 노드를 평가하는 순서에 따라 리프 노드를 계산하는 횟수가 달라진다. Ciel은 각 노드의 자식을 임의의 순서로 평가할 수 있을 때, 리프 계산 횟수의 최솟값과 최댓값을 알고 싶어 한다. Ciel이 사용하는 알고리즘은 다음과 같다.

function negamax(node, α, β)
    if node is a terminal node
        return value of leaf node
    else
        foreach child of node
            val := -negamax(child, -β, -α)
            if val >= β
                return val
            if val > α
                α := val
        return α

negamax algorithm

입력

첫 줄에 게임 트리의 정점 수 nn이 주어진다. 둘째 줄에는 각 정점 ii의 평가값 pip_i가 nn개 주어진다. 이어지는 nn개의 줄에 트리 정보가 주어지며, kik_i는 정점 ii의 자식 수이고, 뒤이어 자식의 번호 tijt_{ij}가 나온다.

n
p1 p2 ... pn
k1 t11 t12 ... t1k
:
:
kn tn1 tn2 ... tnk
  • 2≤n≤1002 \le n \le 100
  • −10000≤pi≤10000-10000 \le p_i \le 10000
  • 0≤ki≤50 \le k_i \le 5
  • 2≤tij≤n2 \le t_{ij} \le n
  • 루트의 번호는 11이다.
  • 입력에서 리프가 아닌 노드의 평가값은 항상 00이다. 필요하면 직접 계산한다.
  • 리프의 평가값이 00인 경우도 있다.
  • 게임 트리는 트리 구조이다.

출력

리프 계산 횟수의 최솟값과 최댓값을 공백으로 구분하여 출력한다.

minimum maximum

예제4

  1. 예제 1

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

    입력
    8
    0 0 100 100 0 -100 -100 -100
    2 2 5
    2 3 4
    0
    0
    3 6 7 8
    0
    0
    0
    
    예상 출력
    3 5
    
  3. 예제 3

    입력
    8
    0 0 100 100 0 100 100 100
    2 2 5
    2 3 4
    0
    0
    3 6 7 8
    0
    0
    0
    
    예상 출력
    3 4
    
  4. 예제 4

    입력
    19
    0 100 0 100 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10
    2 2 3
    0
    2 4 5
    0
    3 6 7 8
    3 9 10 11
    3 12 13 14
    3 15 16 17
    2 18 19
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    
    예상 출력
    7 12