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 which have n-1 communication routes can cover all of their soldiers. Information can exchange between any two soldiers by the communication routes. The number 1 soldier is
the total commander and other soldiers who have only one neighbour is the frontline soldier.

Your boss zzn ordered you to cut off some routes to make any frontline soldiers in the network cannot reflect the information they collect from the battlefield to the total commander( number 1 soldier).

There is a kind of device who can choose some routes to cut off . But the cost (w) of any route you choose to cut off can’t be more than the device’s upper limit power. And the sum of the cost can’t be more than the device’s life m.

Now please minimize the upper limit power of your device to finish your task.

Input

The input consists of several test cases.

The first line of each test case contains 2 integers: n(n<=1000)m(m<=1000000).

Each of the following N-1 lines is of the form:

ai bi wi

It means there’s one route from ai to bi(undirected) and it takes wi cost to cut off the route with the device.

(1<=ai,bi<=n,1<=wi<=1000)

The input ends with n=m=0.

Output

Each case should output one integer, the minimal possible upper limit power of your device to finish your task.

If there is no way to finish the task, output -1.

Sample Input

5 5
1 3 2
1 4 3
3 5 5
4 2 6
0 0

Sample Output

3
/**
hdu 3586  树形dp二分求解
题目大意:给定一棵树n个点,点1是根节点,每个叶子节点都向根节点传递“消息”,我们要在一些路上阻止,使路径不通。每条路上的阻止代价为该路权值,
          我们能阻止的权值有一个上限x,而且所有叶子节点阻止的代价和不能超过m。问最小的可行x
解题思路:假设我们已经到了一个x,那么以u为根节点的子树的总花费dp[u],若边权值w<=x,dp[u]+=min(dp[v],w),否则dp[u]+=min(dp[v],inf),
           这里的inf为任意一个大于m的数(但注意不要爆掉int,我取的m+1)。解释一下为什么用inf,因为w值已经超过限制我们不能阻止w边了,
           那么要阻止以v为根节点子树的所有叶子节点,只能是dp[v]了。这样树形dp就可以求出dp[1],和m比较即可知道我们的x值合不合适了。
           对于x二分就可以了。
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=1005;

struct note
{
    int v,w,next;
}edge[maxn*2];

int head[maxn],ip;
int n,m,mid,dp[maxn];

void init()
{
    memset(head,-1,sizeof(head));
    ip=0;
}

void addedge(int u,int v,int w)
{
   edge[ip].v=v,edge[ip].w=w,edge[ip].next=head[u],head[u]=ip++;
}

void dfs(int u,int pre)
{
    int flag=0;
    for(int i=head[u];i!=-1;i=edge[i].next)///求解父亲节点前它的所有儿子节点必须全部已经求出
    {
        int v=edge[i].v;
        if(v==pre)continue;
        flag=1;
        dfs(v,u);
    }
    if(flag==0)///叶子节点
    {
        dp[u]=m+1;///任意一个大于m的数
        return;
    }
    int t=0;
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        int w=edge[i].w;
        int v=edge[i].v;
        if(v==pre)continue;
        if(w<=mid)
           dp[u]+=min(dp[v],w);
        else
           dp[u]+=min(dp[v],m+1);
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        if(n==0&&m==0)break;
        int maxx=0;
        init();
        for(int i=0;i<n-1;i++)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            addedge(u,v,w);
            addedge(v,u,w);
            maxx+=w;
        }
        int l=1,r=maxx;
        int flag=0;
        while(l<r)
        {
            mid=(l+r)>>1;
            memset(dp,0,sizeof(dp));
            dfs(1,-1);
          //  printf("%d %d\n",mid,dp[1]);
            if(dp[1]<=m)
            {
                flag=1;
                r=mid;
            }
            else
                l=mid+1;
        }
        if(flag==0)
            printf("-1\n");
        else
            printf("%d\n",r);
    }
    return 0;
}
/**
5 4
1 3 2
1 4 3
3 5 5
4 2 6

5 4
1 3 2
1 4 2
3 5 5
4 2 6

5 3
1 3 2
1 4 2
3 5 5
4 2 6

*/
时间: 2024-10-12 15:04:57

hdu3586 树形dp+二分求解的相关文章

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,sizeo

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

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

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

[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,然后就没有下面了. 算是普通难度,只要知道二分就很好写,虽然我开

hdu2242(树形dp+tarjan+缩点)

hdu2242 http://acm.hdu.edu.cn/showproblem.php?pid=2242 给定n,m表示n个点,m条边 每个点有个权值 问我们删除两某条边(割边)后将图分为两个部分,要使得两个部分的权值之差最小 这题的弱化版本是在一棵树上删除某条边后后将图分为两个部分,要使得两个部分的权值之差最小.是用树形dp来做的 但是这道题目是个图,但是我们可以转化为树,即将图中的边连通分量求出来,然后缩成一个点,建出一个新的树图,那么就可以用树形dp来求解题目了. 1 #include

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

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