P4395 [BOI2003] Gem 气垫车

/*
直接贪心 用1/2 但可以hcak
考虑最优解的情况下
令maxval为无根树的根 可见 maxval 与层数有关
当N总数一定时 二叉树最深 logN+1一定>=maxval
*/
/*
10 
7 5 
1 2 
1 7 
8 9 
4 1 
9 7 
5 6 
10 2 
9 3

14

*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<queue>
#include<vector>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=1e4 +10;
const int mod=998244353;
const int inf=0x3f3f3f3f;

int n,f[maxn][20],ans=inf;
int head[maxn],to[maxn<<1],nxt[maxn<<1],tot;

void add(int a,int b){
    to[++tot]=b,nxt[tot]=head[a],head[a]=tot;
}

void dfs(int u,int fa)
{
    for(int i=1;i<=14;i++) f[u][i]=i;
    
    for(int i=head[u];i;i=nxt[i])
    {
        int v=to[i];if(v==fa) continue;
        dfs(v,u);
        for(int j=1;j<=14;j++){
            int minn=inf;
            for(int k=1;k<=14;k++){
                if(k!=j) minn=min(minn,f[v][k]);
            }
            f[u][j]+=minn;
        }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n-1;i++){
        int a,b;cin>>a>>b;
        add(a,b),add(b,a);
    }
    dfs(1,0);
    
    for(int i=1;i<=14;i++) ans=min(ans,f[1][i]);
    cout<<ans<<'\n';
    
    return 0;
}

 

posted @ 2023-11-12 09:31  JMXZ  阅读(12)  评论(0)    收藏  举报