给出一棵树,要求你为树上的结点标上权值,权值可以是任意的正整数
唯一的限制条件是相临的两个结点不能标上相同的权值,要求一种方案,使得整棵树的总价值最小。
考虑 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; }
标签:int,add,权值,BOI2003,inf,P4395,Gem From: https://www.cnblogs.com/towboa/p/17184611.html