#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <set>
#include <algorithm>
#include <vector>
using namespace std;
#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)
#define rep1(i,n) for(int (i)=1;(i)<=(n);(i)++)
const int maxn = 505050;
int d[maxn][2],n,L,R;
struct node{
int to,v;
node(int x=0,int y=0):to(x),v(y){}
};
vector<node> G[maxn];
bool vis[maxn][2];
void dfs(int u,int fa,int sum){
if(G[u].size()==1&&G[u][0].to==fa){
d[u][0]=((sum>=L&&sum<=R) ? sum : 0);
d[u][1]=((sum>=L&&sum<=R) ? sum : 0);
return ;
}
for(int i=0;i<G[u].size();i++){
node c = G[u][i];
if(G[u][i].to == fa) continue;
dfs(G[u][i].to,u,sum+c.v);
}
}
int dp(int i,int j,int fa){
if(vis[i][j]) return d[i][j];
vis[i][j] = 1;
if(G[i].size()==1&&G[i][0].to==fa){
return d[i][j];
}
if(!(j&1)){
d[i][j] = 0;
for(int k=0;k<G[i].size();k++)if(G[i][k].to!=fa){
node& u = G[i][k];
if(!d[i][j]) d[i][j] = dp(u.to,1,i);
else d[i][j] = max(d[i][j],dp(u.to,1,i));
}
}
else{
d[i][j] = 0;
for(int k=0;k<G[i].size();k++)if(G[i][k].to!=fa){
node& u = G[i][k];
if(!d[i][j]) d[i][j] = dp(u.to,0,i);
else{
int ans = dp(u.to,0,i);
if(ans > 0) d[i][j] = min(d[i][j],ans);
}
}
}
return d[i][j];
}
int main()
{
while(scanf("%d %d %d",&n,&L,&R)==3){
rep(i,n) G[i].clear();
rep(i,n-1){
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
G[x].push_back(node(y,z));
G[y].push_back(node(x,z));
}
dfs(0,-1,0);
memset(vis,0,sizeof(vis));
int ans = dp(0,0,-1);
if(ans) printf("%d\n",ans);
else printf("Oh, my god!\n");
}
return 0;
}
UVA - 1484(树形dp,最大值最小值同时维护)
最新推荐文章于 2022-03-10 09:19:22 发布