传送门
http://www.lydsy.com/JudgeOnline/problem.php?id=1369
题目大意
给树上点附正整数权值,要求相邻两点权值不同,询问最小权值和
题解
第一想法肯定是黑白染色染1,2
然后下张图就发现只染两种颜色并不最优(两边是大子树,使其父节点强制染2)
然后就是染色范围定一个20左右就树形DP好了
const
maxn=1005;
var
w:array[0..3*maxn,1..2]of longint;
dp:array[0..maxn,1..20]of longint;
i,j,k:longint;
n,m,len,ans,temp,a,b:longint;
function min(a,b:longint):longint;
begin if a>b then exit(b) else exit(a); end;
procedure init(a,b:longint);
begin
w[len,1]:=b;
if w[a,2]=0 then w[a,2]:=len else w[w[a,1],2]:=len;
w[a,1]:=len; inc(len);
end;
procedure dfs(a,fa:longint);
var tt,i,j:longint;
begin
tt:=w[a,2];
for i:=1 to 20 do
dp[a,i]:=i;
while tt<>0 do
begin
if (w[tt,1]<>fa) then
begin
dfs(w[tt,1],a);
for i:=1 to 20 do
begin
temp:=maxlongint;
for j:=1 to 20 do
if (j<>i) then temp:=min(temp,dp[w[tt,1],j]);
inc(dp[a,i],temp);
end;
end;
tt:=w[tt,2];
end;
end;
begin
readln(n); len:=n+1;
for i:=1 to n-1 do
begin readln(a,b); init(a,b); init(b,a); end;
ans:=maxlongint; dfs(1,0);
for i:=1 to 20 do
ans:=min(ans,dp[1,i]);
writeln(ans);
end.