https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3089
题意大体是男想要更大的路权,女想要更少的路权,但还要保证路权在LR范围内
树形dp从下往上走男生选的时候,就选一个较大的且在范围内的,女选的时候就选一个较小的且在范围内的,
找了好多题解,hdu都是过不了的。只能过UVAlive上的,应该是数据谁,不过这个思路挺好的。。。
#include<stdio.h>
#include<algorithm>
#include<vector>
#define inf 0x3f3f3f3f
using namespace std;
struct node
{
int ne,cost;
};
vector<node>w[500005];
int dp[500005];
int l,r;
long long sum;
int dfs(int x, bool flog, int t)
{
if(flog)
dp[x]=-inf;
else
dp[x]=inf;
if(w[x].size()==0)
{
dp[x]=t;
return 0;
}
for(int i=0;i<w[x].size();i++)
{
// sum+=w[x][i].cost;
dfs(w[x][i].ne, !flog, w[x][i].cost);
// sum-=w[x][i].cost;
if(flog && dp[w[x][i].ne]+t<=r && dp[w[x][i].ne]+t>=l)
{
dp[x]=max(dp[x], dp[w[x][i].ne]+t);
}
else if(!flog && dp[w[x][i].ne]+t<=r && dp[w[x][i].ne]+t>=l)
{
dp[x]=min(dp[x], dp[w[x][i].ne]+t);
}
}
}
int main()
{
int n,a,b,c;
while(~scanf("%d%d%d",&n,&l,&r))
{
for(int i=0;i<n;i++)
w[i].clear();
for(int i=0;i<n-1;i++)
{
scanf("%d %d %d",&a,&b,&c);
node point;
point.ne=b;
point.cost=c;
w[a].push_back(point);
}
sum=0;
dfs(0,1,0);
if(dp[0]<=r&&dp[0]>=l)
printf("%d\n",dp[0]);
else
printf("Oh, my god!\n");
}
return 0;
}