๐ก Info
๋ด์ฉ
N๊ฐ์ ๋ง์๋ก ์ด๋ฃจ์ด์ง ๋๋ผ๊ฐ ์๋ค. ํธ์์ ๋ง์์๋ 1๋ถํฐ N๊น์ง ๋ฒํธ๊ฐ ๋ถ์ด ์๋ค๊ณ ํ์. ์ด ๋๋ผ๋ ํธ๋ฆฌ(Tree) ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์ฆ ๋ง์๊ณผ ๋ง์ ์ฌ์ด๋ฅผ ์ง์ ์๋ N-1๊ฐ์ ๊ธธ์ด ์์ผ๋ฉฐ, ๊ฐ ๊ธธ์ ๋ฐฉํฅ์ฑ์ด ์์ด์ A๋ฒ ๋ง์์์ B๋ฒ ๋ง์๋ก ๊ฐ ์ ์๋ค๋ฉด B๋ฒ ๋ง์์์ A๋ฒ ๋ง์๋ก ๊ฐ ์ ์๋ค. ๋, ๋ชจ๋ ๋ง์์ ์ฐ๊ฒฐ๋์ด ์๋ค. ๋ ๋ง์ ์ฌ์ด์ ์ง์ ์๋ ๊ธธ์ด ์์ ๋, ๋ ๋ง์์ด ์ธ์ ํด ์๋ค๊ณ ํ๋ค.
์ด ๋๋ผ์ ์ฃผ๋ฏผ๋ค์๊ฒ ์ฑ์ทจ๊ฐ์ ๋์ฌ ์ฃผ๊ธฐ ์ํด, ๋ค์ ์ธ ๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด์ N๊ฐ์ ๋ง์ ์ค ๋ช ๊ฐ์ ๋ง์์ '์ฐ์ ๋ง์'๋ก ์ ์ ํ๋ ค๊ณ ํ๋ค.
1๏ธโฃ '์ฐ์ ๋ง์'๋ก ์ ์ ๋ ๋ง์ ์ฃผ๋ฏผ ์์ ์ด ํฉ์ ์ต๋๋ก ํด์ผ ํ๋ค.
2๏ธโฃ ๋ง์ ์ฌ์ด์ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด์, ๋ง์ผ ๋ ๋ง์์ด ์ธ์ ํด ์์ผ๋ฉด ๋ ๋ง์์ ๋ชจ๋ '์ฐ์ ๋ง์'๋ก ์ ์ ํ ์๋ ์๋ค. ์ฆ '์ฐ์ ๋ง์'๋ผ๋ฆฌ๋ ์๋ก ์ธ์ ํด ์์ ์ ์๋ค.
3๏ธโฃ ์ ์ ๋์ง ๋ชปํ ๋ง์์ ๊ฒฝ๊ฐ์ฌ์ ๋ถ๋ฌ์ผ์ผํค๊ธฐ ์ํด์, '์ฐ์ ๋ง์'๋ก ์ ์ ๋์ง ๋ชปํ ๋ง์์ ์ ์ด๋ ํ๋์ '์ฐ์ ๋ง์'๊ณผ๋ ์ธ์ ํด ์์ด์ผ ํ๋ค.
๊ฐ ๋ง์ ์ฃผ๋ฏผ ์์ ๋ง์ ์ฌ์ด์ ๊ธธ์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋๋ก '์ฐ์ ๋ง์'์ ์ ์ ํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐ฅ์ ๋ ฅ ์กฐ๊ฑด
7
1000 3000 4000 1000 2000 2000 7000
1 2
2 3
4 3
4 5
6 2
6 7
๐ค์ถ๋ ฅ ์กฐ๊ฑด
14000
์ค์ ํ์ด ์๊ฐ : 35๋ถ
์ ๋ ฅ
๊ณ์ฐ
์ถ๋ ฅ
๋ณ๋ ๋ฉ์๋
import java.util.*;
public class Main {
static int N;
static int[] arr;
static int[][] adj;
static int[][] town;
static boolean[] visited;
static int result;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
arr = new int[N+1];
for(int i=1; i<=N; i++){
arr[i] = sc.nextInt();
}
adj = new int[N+1][N+1];
for(int i=0; i<N+1; i++){
for(int j=0; j<N+1; j++) {
int u = sc.nextInt();
int v = sc.nextInt();
adj[u][v] = 1;
adj[v][u] = 1;
}
}
town = new int[N+1][2];
visited = new boolean[N+1];
dfs(1);
result = Math.max(town[1][0] , town[1][1]);
System.out.println(result);
}
public static void dfs(int n){
visited[n] = true;
town[n][0] = 0;
town[n][1] = arr[n];
for (int i = 1; i <= N; i++) {
if (adj[n][i] == 1 && !visited[i]) {
dfs(i);
town[n][0] += Math.max(town[i][0], town[i][1]);
town[n][1] += town[i][0];
}
}
}
}
//before
arr = new int[N+1];
for(int i=1; i<=N; i++){
arr[i] = sc.nextInt();
}
adj = new int[N+1][N+1];
for(int i=0; i<N+1; i++){
for(int j=0; j<N+1; j++) {
int u = sc.nextInt();
int v = sc.nextInt();
adj[u][v] = 1;
adj[v][u] = 1;
}
}
town = new int[N+1][2];
//after
arr = new int[N+1];
for(int i=1; i<=N; i++){
arr[i] = sc.nextInt();
}
adj = new int[N+1][N+1];
for(int i=0; i<N-1; i++){
int u = sc.nextInt();
int v = sc.nextInt();
adj[u][v] = 1;
adj[v][u] = 1;
}
town = new int[N+1][2];
...
static List<Integer>[] adj;
...
adj = new ArrayList[N+1];
for(int i = 1; i <= N; i++){
adj[i] = new ArrayList<>();
}
for(int i = 0; i < N-1; i++){
int u = sc.nextInt();
int v = sc.nextInt();
adj[u].add(v);
adj[v].add(u);
}
...
for (int i = 0; i < adj[n].size(); i++) {
int neighbor = adj[n].get(i);
if (!visited[neighbor]) {
dfs(neighbor);
town[n][0] += Math.max(town[neighbor][0], town[neighbor][1]);
town[n][1] += town[neighbor][0];
}
}
}
}
์ค์ ํ์ด ์๊ฐ : 55๋ถ(์ฒซ ํ์ด ์๊ฐ ํฌํจ)
์ ๋ ฅ
๊ณ์ฐ
์ถ๋ ฅ
๋ณ๋ ๋ฉ์๋
import java.util.*;
public class Main {
static int N;
static int[] arr;
static List<Integer>[] adj;
static int[][] town;
static boolean[] visited;
static int result;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
arr = new int[N+1];
for(int i=1; i<=N; i++){
arr[i] = sc.nextInt();
}
adj = new ArrayList[N+1];
for(int i = 1; i <= N; i++){
adj[i] = new ArrayList<>();
}
for(int i = 0; i < N-1; i++){
int u = sc.nextInt();
int v = sc.nextInt();
adj[u].add(v);
adj[v].add(u);
}
town = new int[N+1][2];
visited = new boolean[N+1];
dfs(1);
result = Math.max(town[1][0] , town[1][1]);
System.out.println(result);
}
public static void dfs(int n){
visited[n] = true;
town[n][0] = 0;
town[n][1] = arr[n];
for (int i = 0; i < adj[n].size(); i++) {
int neighbor = adj[n].get(i);
if (!visited[neighbor]) {
dfs(neighbor);
town[n][0] += Math.max(town[neighbor][0], town[neighbor][1]);
town[n][1] += town[neighbor][0];
}
}
}
}