一、前言

  最开始卡这题是某大佬给出的树DP专题中的一个,据说类似于对抗搜索(这是啥?)的一题

  但是在经历了若干艰难困苦之后发现这题在HDU上A不了——(先卡vector的时间,后卡输入的时间,上了输入挂还是玄学超时)。于是遵从百度到的大佬指点,上UVA上面交了一发,发现500毫秒过得。。。感觉心好累。。。。

二、题意

  A,B两人计划在一棵树上旅行,A想尽量短,B想尽量长,但是有个区间规定了这个时间长短:L和R。考虑到是B开始出发,于是求能够在L-R区间内得到的最远的距离。如果得不到就输出“Oh, my god!”

  思路大概是,设DP【i】为第i号节点的最优解——(不论是对A还是B来说的最优解)。能这么干是因为,树的形状、起始节点一旦给定就会使得每个节点由射来选择成为一个固定选项。因而可以直接这么设定。于是,剩下的比较简单——A在区间内选最小,B在区间内选最大。

#include<stdio.h>
#include<string.h>
using namespace std;
#define ll int
#define pp pair<int,ll>
#define vecp vector<pp> const long long MAXN=; //vecp G[MAXN]; inline void read_int(int &ret)
{
ret=;
char c=getchar();
while(c>''||c<'')c=getchar();
while(c<=''&&c>='')ret=ret*+c-'',c=getchar();
} class node
{
public:
int next;
int to;
ll cost;
void make(int next,int a,ll b)
{
this->next=next;
to=a;
cost=b;
} };node G[MAXN*];
int number[MAXN];
int size;int cnt[MAXN];
void add(int a,int b,ll c)
{
// number[a]=size;
cnt[a]++;
G[size].make(number[a],b,c);
number[a]=size++;
} ll dp[MAXN];
ll n,l,r; inline bool check(ll tmp)
{
return tmp>=l&&tmp<=r;
} void checkMin(ll &a,ll b)
{
a= a==-||a>b ? b:a;
}
void checkMax(ll &a,ll b)
{
a= a==-||a<b ? b:a;
} void dfs(int now,int last,ll maxx,bool isBob)
{
// int len=G[now].size(); dp[now]=-;
for(int i=number[now];i!=-;i=G[i].next)
// for(int i=0;i<len;++i)
{
int tar=G[i].to;
// int tar=G[now][i].first;
if(tar==last)continue;
// ll cost=G[now][i].second;
ll cost=G[i].cost;
dfs(tar,now,maxx+cost,!isBob);
if(dp[tar]==-)continue;
ll summ=maxx+cost+dp[tar];
if(!check(summ))continue;
if(isBob)checkMax(dp[now],dp[tar]+cost);
else checkMin(dp[now],dp[tar]+cost);
}
if(cnt[now]==&&dp[now]==-)dp[now]=;
// if(len==1&&dp[now]==-1)dp[now]=0;
} void init()
{
memset(number,-,*(n+));
memset(cnt,,*(n+));
size=;
for(int i=;i<n;++i)
{
ll a,b,c;
read_int(a);
read_int(b);
read_int(c);
// scanf("%d%d%d",&a,&b,&c);
// cin>>a>>b>>c;
// G[a].push_back(make_pair(b,c));
// G[b].push_back(make_pair(a,c)); add(a,b,c);
add(b,a,c);
}
dfs(,-,,);
if(dp[]!=-)printf("%d\n",dp[]);
// cout<<dp[0]<<"\n";
else puts("Oh, my god!");
} int main()
{
// cin.sync_with_stdio(false);
while(scanf("%d%d%d",&n,&l,&r)!=EOF&&n&&l&&r)init(); return ;
}

UVA1484 Alice and Bob's Trip (hdu3660)的更多相关文章

  1. hdu 3660 Alice and Bob's Trip(树形DP)

    Alice and Bob's Trip Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  2. HDU 3660 Alice and Bob's Trip

    树形dp,这道题如果选G++的话,只输入都会超时.我是C++ 1900ms + 飘过的...但是输入优化后就快了很多了,1100ms左右.dfs按层次求最值就行了,差不多也算是博弈吧,到bob取的时候 ...

  3. 【HDOJ】3660 Alice and Bob's Trip

    就是一个基本的dfs.可关键问题是c/c++/g++光输入就超时了.还是写java过的,毕竟时限4s.都放弃希望了,没想到还真过了. import java.lang.*; import java.i ...

  4. UVA 1484 - Alice and Bob&#39;s Trip(树形DP)

    题目链接:1484 - Alice and Bob's Trip 题意:BOB和ALICE这对狗男女在一颗树上走,BOB先走,BOB要尽量使得总路径权和大,ALICE要小,可是有个条件,就是路径权值总 ...

  5. 2016中国大学生程序设计竞赛 - 网络选拔赛 J. Alice and Bob

    Alice and Bob Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  6. bzoj4730: Alice和Bob又在玩游戏

    Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...

  7. Alice and Bob(2013年山东省第四届ACM大学生程序设计竞赛)

    Alice and Bob Time Limit: 1000ms   Memory limit: 65536K 题目描述 Alice and Bob like playing games very m ...

  8. sdutoj 2608 Alice and Bob

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2608 Alice and Bob Time L ...

  9. hdu 4268 Alice and Bob

    Alice and Bob Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Tota ...

随机推荐

  1. Aspx比较简单的登录

    客户端 <form id="form1" runat="server"> <div> 用户名:<input type=" ...

  2. PC端下载图片

    PC端将图片下载到本地saveFile(imgdata,filename){ var save_link=document.createElementNS('http://www.w3.org/199 ...

  3. hibernate课程 初探单表映射2-2 hibernate常用配置

    1 hibernate.cfg.xml常用配置: show_sql 控制台打印sql format_sql 控制台将sql排版 hbm2ddl.auto: create 删除表结构,重新建表并插值 u ...

  4. codevs 原创抄袭题 5969 [AK]刻录光盘

    题目描述 Description • 在FJOI2010夏令营快要结束的时候,很多营员提出来要把整个夏令营期间的资料刻录成一张光盘给大家,以便大家回去后继续学习.组委会觉得这个主意不错!可是组委会一时 ...

  5. 观察者模式(Observe Pattern)

    观察者模式: 当对象存在一对多关系时,使用观察者模式(Observe Pattern).例如:当一个对象被修改时,会通知它的依赖对象. 介绍: 1.意图:定义对象的一种一对多的依赖关系,当一个对象的状 ...

  6. 一个普通 iOS 码农的几个小项目相关知识点总结

    题记:在开发的路途上,有的人走的很深很远,而对于停留在初级阶段的我来说,还要学的.经历的还有很多... list sqlite 数据库中,当把表里的数据都清空时,下次插入的数据的 id 主键不会从 0 ...

  7. django建议入门-FYI

    django 简易博客 现在正式开始博客开发 1安装官方发布版 官方发布的版本带有一个版本号,例如1.0.3或1.1,而最新版本总是可以在http://www.djangoproject.com/do ...

  8. POJ-2195 Going Home---KM算法求最小权值匹配(存负边)

    题目链接: https://vjudge.net/problem/POJ-2195 题目大意: 给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致.man每移动一格 ...

  9. 在docker镜像中加入环境变量

    原文链接 前言 reference:https://vsupalov.com/docker-build-time-env-values/ 很多时候,我们需要在docker镜像中加入环境变量,本人了解的 ...

  10. C# sizeof运算符

    一.C# sizeof运算符 sizeof运算符用于获取值类型的字节数. 二.示例 using System;using System.Collections.Generic;using System ...