#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;
}
hdu5682 zxa and leaf【dfs+树形dp】
最新推荐文章于 2019-02-01 17:17:00 发布