给出一棵树,要求你为树上的结点标上权值,权值可以是任意的正整数
唯一的限制条件是相临的两个结点不能标上相同的权值,要求一种方案,使得整棵树的总价值最小。
考虑 j 为权值, 这个值不是1,2,但有个上界 logn ,ORZ
F[u][ j ] += min(F[y][k])
#include <bits/stdc++.h>
using namespace std ;
const int N=1e5+2,inf=0x3f3f3f3f;
int f[N][19],n;
int go[N<<1],nxt[N<<1],hd[N],all;
void add(int x,int y){
go[++all]=y,nxt[all]=hd[x],hd[x]=all;
}
void dp(int x,int last){
int i,j,k,y,t;
for(i=1;i<=15;i++) f[x][i]=i;
for(i=hd[x];i;i=nxt[i]){
y=go[i]; if(y==last) continue; dp(y,x);
for(j=1;j<=15;j++){
t=inf;
for(k=1;k<=15;k++) if(j!=k) t=min(t,f[y][k]);
f[x][j]+=t;
}
}
}
signed main(){
int i,x,y;
cin>>n;
for(i=1;i<n;i++) cin>>x>>y,add(x,y),add(y,x);
dp(1,0);
x=inf; for(i=1;i<=15;i++) x=min(x,f[1][i]);
cout<<x;
}
浙公网安备 33010602011771号