hdu 3660 Realtime Status(树形dp)

来源:互联网 发布:ios 判断app网络权限 编辑:程序博客网 时间:2024/06/05 16:09

题目链接:点击打开链接

题意:Alice和Bob两个人从根0出发,轮流选择路径,Bob开始选,在满足总距离在区间[l,r]内,Bob总是选使总距离最大的路径走,Alice总是选使总距离最小的路径走,求最后走的总距离的最大值

dp[i]表示两人从节点i出发满足各自要求的极值(对于Bob来说是最大值,对于Alice来说是最小值)

对于Bob:dp[i]=max(dp[i],we+dp[v])

对于Alic:dp[i]=min(dp[i],we+dp[v])

两人各自的选择标准不一样,dp[i]综合了两个人的选择

//下面的代码一直超时,从其他博客找代码试着交了交,也是超时......

#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>using namespace std;#define M 0x3f3f3f3fstruct node{int to;int we;int next;}edge[500005];int cnt,head[500005];int n,l,r,dp[500005];void Add(int x,int y,int z){cnt++;edge[cnt].to=y;edge[cnt].we=z;edge[cnt].next=head[x];head[x]=cnt;}void DP(int x,int dis,int turn){int i=head[x];if(!i){dp[x]=0;return;}dp[x]=turn?M:-1;for(;i;i=edge[i].next){int to=edge[i].to;DP(to,dis+edge[i].we,turn^1);if(dp[to]==-1||dp[to]==M){//走该节点 to 满足不了全程[l,r]的要求continue;}int te=dis+edge[i].we+dp[to];if(te>=l&&te<=r){if(turn|1){dp[x]=max(dp[x],te-dis);}else{dp[x]=min(dp[x],te-dis);}}}}int main(){int x,y,z;while(scanf("%d%d%d",&n,&l,&r)!=EOF){cnt=0;memset(head,0,sizeof(head));for(int i=1;i<n;i++){scanf("%d%d%d",&x,&y,&z);Add(x,y,z);}DP(0,0,0);if(dp[0]!=-1){printf("%d\n",dp[0]);}else{printf("Oh, my god!\n");}}return 0;}
1 0