zoukankan      html  css  js  c++  java
  • hdu3586 树形dp+二分答案

    /*
    dp[i]表示孤立i结点的费用,二分功率上限w,即dp[i]在选择时不可以选择功率大于w的边 
    */
    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 1050
    struct Edge{int to,nxt,w;}edge[maxn<<1];
    int x,flag[maxn],dp[maxn],tot,head[maxn],n,m;
    void init(){
        tot=0;
        memset(head,-1,sizeof head);
    }
    void addedge(int u,int v,int w){
        edge[tot].to=v;edge[tot].nxt=head[u];edge[tot].w=w;head[u]=tot++; 
    }
    int dfs(int u,int pre){
        for(int i=head[u];i!=-1;i=edge[i].nxt){
            int v=edge[i].to,tmp=edge[i].w;
            if(tmp>x)tmp=1100000;
            if(v==pre)continue;
            if(flag[v]==0)dp[u]+=tmp;//叶子结点 
            else dp[u]+=min(tmp,dfs(v,u));
        }
        return dp[u];
    }
    int judge(int mid){
        x=mid;
        memset(dp,0,sizeof dp);
        dfs(1,0);
        if(dp[1]>m)return 0;
        return 1;
    }
    int main(){
        while(cin>>n>>m&&n){
            init();
            int u,v,w,l=1000000,r=1,mid,ans=-1;
            memset(flag,0,sizeof flag);
            for(int i=1;i<n;i++){
                cin>>u>>v>>w;
                addedge(u,v,w);
                addedge(v,u,w);
                flag[u]=1;
                l=min(l,w);r=max(r,w);
            }
            
            while(l<=r){
                mid=l+r>>1;
                if(judge(mid))
                    ans=mid,r=mid-1;
                else l=mid+1;
            }
        
            printf("%d
    ",ans);
        }    
    } 
  • 相关阅读:
    Redpine的Lite-Fi解决方案获Wi-Fi CERTIFIED认证
    植物园偶遇一直喵
    美食篇
    端午节路过南站
    黄山云海
    一品黄山 天高云淡
    黄山的日出日落
    宏村,寻找你的前世今生
    git把本地文件上传到github上的步骤
    一张照片一个故事
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10341331.html
Copyright © 2011-2022 走看看