Skip to content

Commit 3e594b0

Browse files
authored
[20251229] BOJ / G3 / 스크루지 민호2 / 이인희
1 parent f983a47 commit 3e594b0

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
```java
2+
import java.io.BufferedReader;
3+
import java.io.IOException;
4+
import java.io.InputStreamReader;
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
public class Main{
9+
private static List<List<Integer>> Graph;
10+
private static int N;
11+
private static int[][] Dp;
12+
private static boolean[] Visited;
13+
public static void main(String args[]) throws IOException {
14+
/*
15+
* dfs(2, parent=none)
16+
* dfs(1, parent=2)
17+
* dfs(4, parent=2)
18+
* dfs(3, parent-2)
19+
*
20+
* dfs(1, parent=2)
21+
* */
22+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
23+
N = Integer.parseInt(br.readLine());
24+
Dp = new int[N+1][2];
25+
// [v][0]: 노드v를 루트으로 하는 부분트리(노드v엔 경찰서없음)에서 최소 경찰서개수
26+
// [v][1]: 노드v를 루트로 하는 부부늩리(노드v엔 경찰서있음)에서 최소 경찰서 개수
27+
String[] temp;
28+
Visited = new boolean[N+1];
29+
Graph = new ArrayList<List<Integer>>();
30+
for(int i = 0; i < N+1; i++)
31+
Graph.add(new ArrayList<Integer>());
32+
for(int i = 0; i < N-1; i++){
33+
temp = br.readLine().split(" ");
34+
int a = Integer.parseInt(temp[0]);
35+
int b = Integer.parseInt(temp[1]);
36+
Graph.get(a).add(b);
37+
Graph.get(b).add(a);
38+
}
39+
//dfs
40+
for(int i = 1; i<N+1; i++)
41+
dfs(i, 0);
42+
int answer = 0;
43+
for(int i = 1; i<N+1; i++){
44+
answer = Math.max(answer, Math.min(Dp[i][0], Dp[i][1]));
45+
}
46+
System.out.println(answer);
47+
br.close();
48+
}
49+
private static void dfs(int cur, int parent){
50+
if(Visited[cur]) return;
51+
Dp[cur][0] = 0;
52+
Dp[cur][1] = 1;
53+
for(int next: Graph.get(cur)){
54+
if(next == parent) continue;
55+
dfs(next, cur);
56+
}
57+
for(int next: Graph.get(cur)){
58+
if(next == parent) continue;
59+
//cur노드에 경찰서-> 자식엔 경찰서가 있어도 없어도됨
60+
Dp[cur][1] += Math.min(Dp[next][0], Dp[next][1]);
61+
//cur노드에 경찰서 두지않음 -> 자식엔 경찰서가 반드시 있어야함
62+
Dp[cur][0] += Dp[next][1];
63+
}
64+
Visited[cur] = true;
65+
}
66+
}
67+
```

0 commit comments

Comments
 (0)