Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions LiiNi-coder/202512/29 BOJ 스크루지 민호2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Main{
private static List<List<Integer>> Graph;
private static int N;
private static int[][] Dp;
private static boolean[] Visited;
public static void main(String args[]) throws IOException {
/*
* dfs(2, parent=none)
* dfs(1, parent=2)
* dfs(4, parent=2)
* dfs(3, parent-2)
*
* dfs(1, parent=2)
* */
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
Dp = new int[N+1][2];
// [v][0]: 노드v를 루트으로 하는 부분트리(노드v엔 경찰서없음)에서 최소 경찰서개수
// [v][1]: 노드v를 루트로 하는 부부늩리(노드v엔 경찰서있음)에서 최소 경찰서 개수
String[] temp;
Visited = new boolean[N+1];
Graph = new ArrayList<List<Integer>>();
for(int i = 0; i < N+1; i++)
Graph.add(new ArrayList<Integer>());
for(int i = 0; i < N-1; i++){
temp = br.readLine().split(" ");
int a = Integer.parseInt(temp[0]);
int b = Integer.parseInt(temp[1]);
Graph.get(a).add(b);
Graph.get(b).add(a);
}
//dfs
for(int i = 1; i<N+1; i++)
dfs(i, 0);
int answer = 0;
for(int i = 1; i<N+1; i++){
answer = Math.max(answer, Math.min(Dp[i][0], Dp[i][1]));
}
System.out.println(answer);
br.close();
}
private static void dfs(int cur, int parent){
if(Visited[cur]) return;
Dp[cur][0] = 0;
Dp[cur][1] = 1;
for(int next: Graph.get(cur)){
if(next == parent) continue;
dfs(next, cur);
}
for(int next: Graph.get(cur)){
if(next == parent) continue;
//cur노드에 경찰서-> 자식엔 경찰서가 있어도 없어도됨
Dp[cur][1] += Math.min(Dp[next][0], Dp[next][1]);
//cur노드에 경찰서 두지않음 -> 자식엔 경찰서가 반드시 있어야함
Dp[cur][0] += Dp[next][1];
}
Visited[cur] = true;
}
}
```