#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
vector<int> edge[maxn];
int sz[maxn],mxx[maxn],mn[maxn],mx[maxn],d[maxn],u[maxn],n;
void init_size(int now,int fa)
{
sz[now]=1;
for(vector<int>::iterator it=edge[now].begin();it!=edge[now].end();it++)
{
if(*it==fa)
continue;
init_size(*it,now);
sz[now]+=sz[*it];
}
}
bool dfs(int now,int fa)
{
int dw=0,up=1;
for(vector<int>::iterator it=edge[now].begin();it!=edge[now].end();it++)
{
if(*it==fa)
continue;
if(!dfs(*it,now))
return false;
dw+=d[*it];
up+=u[*it];
}
d[now]=max(mn[now],dw);
u[now]=min(mx[now],up);
return d[now]<=u[now];
}
bool check(int num)
{
for(int i=1;i<=n;i++)
{
mx[i]=min(num-mxx[i],sz[i]);
if(mx[i]<0)
return false;
}
return dfs(1,0)&&u[1]>=num&&d[1]<=num;
}
int main()
{
int m,i,j,u,v,f,t;
scanf("%d",&t);
while(t--&&scanf("%d",&n)!=EOF)
{
memset(mn,0,sizeof(mn));
memset(mxx,0,sizeof(mxx));
memset(edge,0,sizeof(edge));
f=0;
for(i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
edge[u].push_back(v);
edge[v].push_back(u);
}
init_size(1,0);
scanf("%d",&m);
while(m--&&scanf("%d%d",&u,&v)!=EOF)
{
mn[u]=max(mn[u],v);
if(mn[u]>sz[u])
f=1;
}
scanf("%d",&m);
while(m--&&scanf("%d%d",&u,&v)!=EOF)
{
mxx[u]=max(mxx[u],v);
if(mxx[u]>n-sz[u])
f=1;
}
if(f)
{
printf("-1\n");
continue;
}
int l=0,r=n,mid;
while(l<r)
{
mid=(l+r)>>1;
if(check(mid))
r=mid;
else
l=mid+1;
}
printf("%d\n",l);
}
return 0;
}
HDU 6241 二分枚举
最新推荐文章于 2019-10-30 20:53:32 发布