hdu5682 zxa and leaf【dfs+树形dp】

来源:互联网 发布:windows xp 解码器 编辑:程序博客网 时间:2024/05/17 12:06
#pragma comment(linker, "/STACK:102400000,102400000")#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#include<vector>using namespace std;const int N=5*10000+10;const long long  up=1e9;int n,k;long long w[N],ll[N],rr[N];vector<int>v[N];int dfs(int u,int fa,long long x){    for(int i=0;i<v[u].size();i++)    {        int a=v[u][i];        if(a==fa) continue;        if(dfs(a,u,x)==0) return 0;        long long l=ll[a]-x;        long long r=rr[a]+x;        if(l>rr[u]||r<ll[u]) return 0;        ll[u]=max(ll[u],l);        rr[u]=min(rr[u],r);    }    return 1;}int check(long long x){    for(int i=1;i<=n;i++)    {        if(w[i]!=-1)            rr[i]=ll[i]=w[i];        else            rr[i]=up,ll[i]=-up;    }    if(dfs(1,-1,x)==1)        return 1;    else        return 0;}int main(){    int _,a,b;    long long  L,R,mid,t,ans;    scanf("%d",&_);    while(_--)    {        scanf("%d%d",&n,&k);        for(int i=1;i<=n;i++)            v[i].clear();        for(int i=0;i<n-1;i++)        {            scanf("%d%d",&a,&b);            v[a].push_back(b);            v[b].push_back(a);        }        memset(w,0xff,sizeof(w));        for(int i=0;i<k;i++)        {            scanf("%d%lld",&a,&t);            w[a]=t;        }        L=0;        R=up;        while(L<=R)        {            mid=L+(R-L)/2;            if(check(mid))            {                R=mid-1;                ans=mid;            }            else            {                L=mid+1;            }        }        printf("%lld\n",ans);    }    return 0;}
1 0