Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

코드와이

[BAEKJOON] 2533.사회망 서비스 본문

acmicpc

[BAEKJOON] 2533.사회망 서비스

코드와이 2021. 12. 11. 19:22

 

트리 DP

 

문제링크

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

 

2533번: 사회망 서비스(SNS)

첫 번째 줄에는 친구 관계 트리의 정점 개수 N이 주어진다. 단, 2 ≤ N ≤ 1,000,000이며, 각 정점은 1부터 N까지 일련번호로 표현된다. 두 번째 줄부터 N-1개의 줄에는 각 줄마다 친구 관계 트리의 에

www.acmicpc.net

 

트리를 이용해서 DP와 DFS를 활용해야 풀 수 있는 문제이다.

루트 노드(임의로 1로 설정)를 잡고 '얼리어답터'인지 아닌지 2가지 경우 수를 따져가며 DFS를 진행한다.

package acmicpc.Gold3;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class 사회망_서비스 {

	static int n, dist[][];
	static List<Integer>[] list;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		n = Integer.parseInt(br.readLine());
		list = new ArrayList[n + 1];
		
		for(int i = 1 ; i <= n ; i++) {
			list[i] = new ArrayList<>();
		}
		
		for(int i = 0 ; i < n - 1 ; i++) {
			st = new StringTokenizer(br.readLine());
			
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			
			list[a].add(b);
			list[b].add(a);
		}
		
		dist = new int[2][n + 1];
		
		dfs(1, -1);
		
		System.out.println(Math.min(dist[0][1], dist[1][1]));
	}
	
	public static void dfs(int cur, int parent) {
		
		dist[0][cur] = 0;
		dist[1][cur] = 1;
		
		for(int next : list[cur]) {
			
			if(next != parent) {
				dfs(next, cur);
				dist[0][cur] += dist[1][next];
				dist[1][cur] += Math.min(dist[0][next], dist[1][next]);
			}
			
		}
		
	}
}

'acmicpc' 카테고리의 다른 글

[BAEKJOON] 2143. 두 배열의 합  (0) 2021.12.18
[BAEKJOON] 11779. 최소비용구하기2  (0) 2021.12.10
[BAEKJOON] 16637. 괄호 추가하기  (0) 2021.12.06
[BAEKJOON] 11437. LCA  (0) 2021.12.01
[BAEKJOON] 2437. 저울  (0) 2021.11.23