[BOI2003] Gem

结论 不同颜色数不会超过 (O(log n))

然后就是很简单的树形dp了

顺便复习一下树形dp怎么写

#include <bits/stdc++.h>
using namespace std;

int f[10005][20];
vector<int> g[10005];
int n,t1,t2,vis[10005];

void dfs(int p) {
    vis[p]=1;
    for(int i=0;i<g[p].size();i++) {
        int q=g[p][i];
        if(vis[q]==0) {
            dfs(q);
            for(int j=1;j<=15;j++) {
                int t=1e+9;
                for(int k=1;k<=15;k++) if(j!=k) {
                    t=min(t,f[q][k]);
                }
                f[p][j]+=t;
            }
        }
    }
    for(int i=1;i<=15;i++) f[p][i]+=i;
}

int main() {
    cin>>n;
    for(int i=1;i<n;i++) {
        cin>>t1>>t2;
        g[t1].push_back(t2);
        g[t2].push_back(t1);
    }
    dfs(1);
    int ans = 1e+9;
    for(int i=1;i<=15;i++) ans=min(f[1][i],ans);
    cout<<ans<<endl;
}
原文地址:https://www.cnblogs.com/mollnn/p/12251458.html