第一个树形DP,做题的时候想出来了,但是一直没有做对。什么时候返回的情况下出了问题。看着题解写的。。。
#include <bits/stdc++.h>
using namespace std;
const int N = 500500;
const int inf = 0x3f3f3f3f;
struct node {
int v,w;
node () {};
node ( int vv,int ww ) {v = vv; w = ww; }
};
int n,l,r;
int dp[N];
vector<node> edge[N];
void dfs( int x,int cnt,int pres)
{
dp[x] = 0 ;
if ( edge[x].size()==0 ) return ;
if ( cnt&1 ) //Min
{
int temp = inf;
for ( int i=0;i<edge[x].size(); i++ )
{
int to = edge[x][i].v;
dfs ( to,cnt+1,pres+edge[x][i].w ) ;
if ( pres+edge[x][i].w+dp[to]>=l && pres+edge[x][i].w+dp[to]<=r )
{
temp = min(temp,edge[x][i].w+dp[to]);
}
}
dp[x] = temp;
}
else //max
{
int temp = -inf;
for ( int i=0;i<edge[x].size(); i++ )
{
int to = edge[x][i].v;
dfs ( to,cnt+1,pres+edge[x][i].w ) ;
if ( pres+edge[x][i].w+dp[to]>=l && pres+edge[x][i].w+dp[to]<=r )
{
temp = max(temp,edge[x][i].w+dp[to]);
}
}
dp[x] = temp;
}
}
int main()
{
while ( scanf("%d%d%d",&n,&l,&r)!=EOF )
{
int x,y,z;
for ( int i=0; i<n; i++ ) edge[i].clear();
for ( int i=1; i<n; i++ )
{
scanf("%d%d%d",&x,&y,&z);
edge[x].push_back( node(y,z) ) ;
}
dfs( 0,0,0 );
if ( dp[0]>=l && dp[0]<=r ) cout<<dp[0]<<endl;
else cout<<"Oh, my god!"<<endl;
}
return 0;
}