1693 : 트리 색칠하기

풀이

http://codersbrunch.blogspot.kr/2017/07/1693.html 읽고 구현한 코드입니다.

코드

#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;

const int n_ = 1e5 + 5;

int n, dp[n_][18];
vector<int> gph[n_];

void dfs(int prv, int now) {
	dp[now][0] = 2e9;
	for (int col = 1; col <= 17; col++) dp[now][col] += col;
	for (int nxt : gph[now]) {
		if (nxt == prv) continue;
		dfs(now, nxt);
		int fst = 0, snd = 0;
		for (int col = 1; col <= 17; col++) {
			if (dp[nxt][snd] > dp[nxt][col]) snd = col;
			if (dp[nxt][fst] > dp[nxt][snd]) swap(fst, snd);
		}
		for (int col = 1; col <= 17; col++) {
			dp[now][col] += dp[nxt][col != fst ? fst : snd];
		}
	}
}

int main() {
	scanf("%d", &n);
	for (int i = 1, u, v; i < n; i++) {
		scanf("%d %d", &u, &v);
		gph[u].push_back(v);
		gph[v].push_back(u);
	}

	dfs(0, 1);

	int ans = 2e9;
	for (int col = 1; col <= 17; col++) ans = min(ans, dp[1][col]);
	printf("%d", ans);

	return 0;
}

아무말

백준, 백준 온라인 저지, BOJ, Baekjoon Online Judge, C, C++, 씨, 씨쁠쁠, JAVA, algorithm, 자바, 알고리즘, 자료구조, 문제, 문제 풀이, 풀이

wookje.kwon's profile image

wookje.kwon

2018-01-07 17:00

Read more posts by this author