一、前言

  最开始卡这题是某大佬给出的树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. Srping MVC中Controller的void方法

    第一种 通过修改response来修改页面 /** * 方式一:通过声明HttpServletResponse类型的方法入参,来使用HttpServletResponse对象. * 注意:在Contr ...

  2. X64下IIS调用32位的dll

    WebAPI项目中遇到了需要调用32位C++的dll的情况,调试的时候能正常调用,但是发布了之后部署在IIS中出现了BadFormatImage异常, 解决方法是在IIS中相应应用程序池=>高级 ...

  3. kafka基础一

    基本概念: 消息系统的组成由生产者,消费者以及存储系统.消费者从存储系统中读取生产者生产的消息.Kafka作为分布式的消息系统支持多个生产者多个消费者,写消息时允许多个生产者写到同一个Partitio ...

  4. Struts2初级篇(HelloWorld)

    Struts2的工作流程: 从一个高水平角度看,Struts2 是一个MVC拉动的(或MVC2)框架,Struts2 的模型-视图-控制器模式是通过以下五个核心部分进行实现的: 操作(Actions) ...

  5. php 04

    前加加(++$a) 先运算后赋值 后加加($a++) 先赋值后运算 -- 前减减(--$a) 先运算后赋值 后减减($a--) 先赋值后运算 连接运算符(字符串运算符) . 神奇的米粒 1. 字符串和 ...

  6. 在SAP云平台的CloudFoundry环境下消费ABAP On-Premise OData服务

    我的前一篇文章 使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise系统里的函数介绍了在SAP云平台的Neo环境下如何通过SAP Cloud Conne ...

  7. Sentinel spring-cloud-gateway adapter(1.6)异常错误之@EnableCircuitBreaker

    sentinal 大坑 使用gateway adaper包出现@EnableCircuitBreaker did you forget include starter的异常 这时候千万不要学我引入cl ...

  8. Linux命令技巧:如何在Linux下重命名多个文件

    我知道我可以用mv命令重命名文件.但是当我想重命名很多文件怎么办?如果为每个文件都这么做将会是很乏味的.有没有办法一次性重命名多个文件? 在Linux中,当你想要改变一个文件名,使用mv命令就好了.然 ...

  9. IOS 核心动画(Core Animation)

    Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它 能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代码就 可以实现非常强大的功能. Core ...

  10. openlayers 初步认识(转)

    OpenLayers是一个开源的js框架,用于在您的浏览器中实现地图浏览的效果和基本的zoom,pan等功能.OpenLayers支持的地图来源 包括了WMS,GoogleMap,KaMap,MSVi ...