알고리즘(백준 등) 공부/백준(자바)

백준 1272번: 특별 노드

posite 2026. 2. 21. 14:28

https://www.acmicpc.net/problem/1272

 

부모보다 자식의 가중치가 더 큰 트리가 주어질 때, 루트 노드를 포함한 특별 노드를 선택해서 특별 노드들을 제외한 노드들의 부모 노드 중 가장 가까운 특별 노드의 가중치를 뺀 값이 해당 노드의 가중치가 될 때 가중치 합의 최소값을 구하는 문제이다.

누적합을 위한 2차원 배열 dp와 DFS를 통해 트리의 맨 아래부터 일반 노드로 만들 때와 특별 노드로 만들 때의 해당 노드까지의 가중치 합의 최소값을 구하여 누적한다. dp[a][b]는 가장 가까운 특별 노드인 부모 노드가 b일 때, 현재 노드 a에서의 최소값을 의미한다.

static int solve(int curr, int specialAnc, int parent) {
    if (dp[curr][specialAnc] != -1) {
        return dp[curr][specialAnc];
    }
    
    int nodeNotSpecial = INF;
    if (curr != root) {
        nodeNotSpecial = weights[curr] - weights[specialAnc];
        for (int next : map.get(curr)) {
            if (next == parent) {
                continue;
            }
            nodeNotSpecial += solve(next, specialAnc, curr);
        }
    }
    
    int nodeSpecial = weights[curr];
    for (int next : map.get(curr)) {
        if (next == parent) {
            continue;
        }
        nodeSpecial += solve(next, curr, curr);
    }
    
    return dp[curr][specialAnc] = Math.min(nodeNotSpecial, nodeSpecial);
}

 

현재 노드를 특별 노드로 선택하지 않은 경우 현재 가중치 - 가장 가까운 특별 노드 가중치 + 선택 하지 않았을 때의 자식 노드들의 최소 가중치로 계산허며, 선택한 경우 현재 가중치 + 선택한 경우의 자식 노드들의 최소 가중치 로 계산하여 최소값을 구하여 둘 중 최솟값을 저장하는 방식으로 누적한다.