UVALive

来源:互联网 发布:如何做淘宝推广赚钱 编辑:程序博客网 时间:2024/06/06 23:20
 第一个树形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; }


0 0