吉吉王国(二分+树形dp)

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了吉吉王国(二分+树形dp)相关的知识,希望对你有一定的参考价值。

吉吉王国

题意:

n个点,m个边,有边权,现在要求叶子节点无法与1号点连通,要求切断的总长度不能超过m,且切断的最长的长度尽可能断

题解:

题意的前半部分可以确定是树形dp,后半部分可以确定为是二分
树形dp部分和这个题差不多
Rinne Loves Edges
我们二分一个长度的上限,然后在dp中限制,判断二分的值是否合理

代码:

#include <bits/stdc++.h>
#define endl '\\n'

using namespace std;

const int maxn=1e3+10;
typedef long long ll;
vector<pair<ll,ll> > edge[maxn];
ll sz[maxn];

ll n,m;
void dfs(ll x,ll fa,ll mid){  //mid为每条道路限制长度
    bool flag=false;
    for(auto i:edge[x]){
        if(i.first==fa) continue;
        dfs(i.first,x,mid);
        flag=true;
        if(i.second>mid) sz[x]+=sz[i.first];
        else sz[x]+=min(i.second,sz[i.first]);
    }
    if(!flag) sz[x]=1e9;
}

bool che(ll x){   //最长的道路
    memset(sz,0,sizeof sz);
    dfs(1,0,x);
    //cout<<sz[1]<<endl;
    if(sz[1]<=m) return true;
    else return false;
}

int main(){
    cin>>n>>m;
    for(ll i=0;i<n-1;i++){
        ll x,y,z;
        cin>>x>>y>>z;
        edge[x].push_back({y,z});
        edge[y].push_back({x,z});
    }
    ll l=1,r=m+1;
    while(l<r){
        ll mid=(l+r)/2;
        if(che(mid))r=mid;
        else l=mid+1;
    }
    if(l==m+1) 
	    cout<<-1<<endl;
	else 
		cout<<l<<endl;

}

以上是关于吉吉王国(二分+树形dp)的主要内容,如果未能解决你的问题,请参考以下文章

习题:JOIOI王国(二分)

HDU 3586 Information Disturbing(二分+树形dp)

HDU-3586 Information Disturbing 树形dp+二分

[bzoj3420]Poi2013 Triumphal arch_树形dp_二分

[bzoj2097][Usaco2010 Dec]Exercise 奶牛健美操_贪心_树形dp_二分

hdu3586 树形dp+二分答案