728x90
https://www.acmicpc.net/problem/12978
메모리: 64,084 KB , 시간: 572 ms
사용 알고리즘: 다이나믹 프로그래밍, 트리에서의 다이나믹 프로그래밍, 트리
728x90
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static ArrayList<ArrayList<Integer>> edges;
static int[][] dp;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
// 도시 연결 상태 저장 리스트
edges = new ArrayList<>();
for(int i = 0; i <= N; i++)
edges.add(new ArrayList<>());
int u, v;
for (int i = 0; i < N - 1; i++) {
st = new StringTokenizer(br.readLine());
u = Integer.parseInt(st.nextToken());
v = Integer.parseInt(st.nextToken());
edges.get(u).add(v);
edges.get(v).add(u);
}
dp = new int[N + 1][2];
// 1번 도시부터 시작
dfs(1, 0);
System.out.println(Math.min(dp[1][0], dp[1][1]));
}
private static void dfs(int now, int parent) {
ArrayList<Integer> edge = edges.get(now);
for(int next : edge) {
if(next != parent) {
dfs(next, now);
// now에 경찰서를 건설할 경우, next에는 건설하든 하지 않든 상관 없음
dp[now][0] += Math.min(dp[next][0], dp[next][1]);
// now에 경찰서를 건설하지 않을 경우, next에는 무조건 건설해야 함
dp[now][1] += dp[next][0];
}
}
// now에 경찰서 건설
dp[now][0] += 1;
}
}
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[백준, BOJ 17485] 진우의 달 여행 (Large) (java) (0) | 2025.05.28 |
---|---|
[백준, BOJ 15732] 도토리 숨기기 (java) (0) | 2025.05.23 |
[백준, BOJ 1404] 토너먼트 승자 (java) (0) | 2025.04.28 |
[백준, BOJ 1326] 폴짝폴짝 (java) (0) | 2025.04.16 |
[백준, BOJ 5585] 거스름돈 (java) (0) | 2025.04.15 |