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\n",ans);
    }
} 

原文地址:https://www.cnblogs.com/zsben991126/p/10341331.html

时间: 2024-10-19 05:21:57

hdu3586 树形dp+二分答案的相关文章

hdu3586 树形dp+二分求解

http://acm.hdu.edu.cn/showproblem.php?pid=3586 Problem Description In the battlefield , an effective way to defeat enemies is to break their communication system. The information department told you that there are n enemy soldiers and their network w

hdu 3586 树形dp+二分

题目大意:给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵 树,每条边都有一个权值cost表示破坏这条边的费用,叶子节点为前线.现要切断前线和司令部的联系,每次切断边的费用不能超过上限limit,问切断所 有前线与司令部联系所花费的总费用少于m时的最小limit.1<=n<=1000,1<=m<=100万 题目要问的是最小的最大限制,必然二分答案 然后对于每一个值,树形DP判定是否可行 dp[i]表示要切断以i为根的其它所有子树的最小代价. 其中设定叶子结点的代价为无穷大

[hdu3586]Information Disturbing树形dp+二分

题意:给出一棵带权无向树,以及给定节点1,总约束为$m$,找出切断与所有叶子节点联系每条边所需要的最小价值约束. 解题关键:二分答案,转化为判定性问题,然后用树形dp验证答案即可. dp数组需要开到ll,如果用设inf的解法. 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn=1e6+7; 5 const int inf=0x3f3f3f3f; 6 struct e

hdu3586 Information Disturbing[二分答案+树形DP]

给定 n 个节点的树,边有权值.1 号点是根,除了 1 号点外的度数为 1 的节点是叶子.要求切断所有叶子和 1 号点之间的联系,切断一条边要花费这条边上权值对应的代价,要求总的代价不超过 m.在满足这个前提下要求切断的边权的最大值最小,求出这个最小值.$n ≤ 10^5$ 首先这个最大值肯定二分答案,然后树形DP限制割掉的边不能超过这个二分的边权,设$f[i]$表示在这个限制下该子树内所有叶子断绝与根的联系的最小代价. 于是$f[i]=max(w_{father},\sum\limits_{y

HDU 3586 Information Disturbing 树形DP+二分

Information Disturbing Problem Description In the battlefield , an effective way to defeat enemies is to break their communication system.The information department told you that there are n enemy soldiers and their network which have n-1 communicati

UvaLive 6534 Join two kingdoms 树形DP+二分

链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4545 题意:两个国家A,B,分别有N座城市和Q座城市(1 ≤ N, Q ≤ 4 × 10^4),每个国家里的城市都是树形结构,每条边的权值都是1.现在要随机从两个国家中各选择一个城市来将两个国家连接起来,问连接起来的大国家里面的最长路的期望是多少. 思路:首先用树形DP

[luogu]P1800 software_NOI导刊2010提高(06)[DP][二分答案]

[luogu]P1800 software_NOI导刊2010提高(06) 题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成m个模块,由公司里的技术人员分工完成,每个技术人员完成同一软件的不同模块的所用的天数是相同的,并且是已知的,但完成不同软件的一个模块的时间是不同的,每个技术人员在同一时刻只能做一个模块,一个模块只能由一个人独立完成而不能由多人协同完成.一个技术人员在整个开发期内完成一个模块以后可以接着做任一软件的任一模块.写

[coci2015-2016 coii] torrent【树形dp 二分】

传送门:http://www.hsin.hr/coci/archive/2015_2016/ 进去之后点最下面那个. 这道题没有想出来,可惜了,其实不难的. 题目是两个"源"的,我们先考虑单源的问题.先把这个源拉成树根,然后设f(i)为以结点i为树根的子树,全部收到文件所需要的时间,由于同一时间,结点i只能向其中一个子结点传送文件,那么假设son(i, j)表示结点i的第j个子结点(程序中不需要这个数组,这里只是为了叙述方便),那么f(i) = max{ j + f( son(i, j

HDU3585 Information Disturbing 树形dp+二分

http://acm.split.hdu.edu.cn/showproblem.php?pid=3586 题意 : 给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用不能超过上限limit,问在保证总费用<=m下的最小的limit. 显然最小的总费用和最小的limit不能同时维护,那么只能在dfs中维护一个然后另一个用特殊的(朗诵)技巧解决-- emmmmmmmmm--说白了就是二分求最小的limit,然后就没有下面了. 算是普通难度,只要知道二分就很好写,虽然我开