zoukankan      html  css  js  c++  java
  • E. Paint the Tree(树形dp)

    题:https://codeforces.com/contest/1241/problem/E

    题目大意:给你一棵树,每一个点都可以染k种颜色,你拥有无数种颜色,每一种颜色最多使用2次,如果一条边的两个节点拥有同一种颜色,那么就说

    这条边是饱和的,一个树的价值定义为饱和边的权值之和,问一棵树的最大价值是多少。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define pb push_back
    const int M=5e5+5;
    int head[M],tot,n,k;
    vector<ll>val;
    ll dp[M][2];
    //dp[u][1] 表示这条边用了k种颜色了。
    //dp[u][0] 表示这条边用了k-1种颜色。
    struct node{
        int v,nextt;
        ll w;
    }e[M<<1];
    bool cmp(int x,int y){
        return x>y;
    }
    void addedge(int u,int v,ll w){
        e[tot].v=v;
        e[tot].w=w;
        e[tot].nextt=head[u];
        head[u]=tot++;
    }
    void dfs(int u,int f){
        dp[u][0]=dp[u][1]=0;
        for(int i=head[u];~i;i=e[i].nextt){
            int v=e[i].v;
            if(v!=f){
                dfs(v,u);
                dp[u][0]+=dp[v][1];
                dp[u][1]+=dp[v][1];
            }
        }
        val.clear();
        for(int i=head[u];~i;i=e[i].nextt){
            int v=e[i].v;
            if(v!=f){//将当前的子节点降到只用了k-1种颜色的最优选择 
                val.pb(dp[v][0]+e[i].w-dp[v][1]);
            }
        }
        sort(val.begin(),val.end(),cmp);
        int len=val.size();
        len=min(len,k);
        for(int i=0;i<len;i++){
            if(val[i]<0)
                break; 
            if(i<k-1)
                dp[u][0]+=val[i];
            
            dp[u][1]+=val[i];
        }
    }
    int main(){
        int t;
        cin>>t;
        while(t--){
            tot=0;
            scanf("%d%d",&n,&k);
            for(int i=0;i<=n;i++)
                head[i]=-1;
            for(int u,v,i=1;i<n;i++){
                ll w;
                scanf("%d%d%I64d",&u,&v,&w);
                addedge(u,v,w);
                addedge(v,u,w);
            }
            dfs(1,-1);
            printf("%I64d
    ",max(dp[1][0],dp[1][1]));
        }
        return 0;
    }
    View Code
  • 相关阅读:
    SD卡测试
    测试人员可能会遇到的问题
    HDU 1024 Max Sum Plus Plus
    HDU 1176 免费馅饼
    HDU 1257 最少拦截系统
    HDU 1087 Super Jumping! Jumping! Jumping!
    poj 1328 Radar Installation
    poj 1753 Flip Game
    HDU 1003 Max Sum
    HDU 5592 ZYB's Premutation(BestCoder Round #65 C)
  • 原文地址:https://www.cnblogs.com/starve/p/11645076.html
Copyright © 2011-2022 走看看