uva 1484 - Alice and Bob's Trip(树形dp)

题目链接:uva 1484 - Alice and Bob‘s Trip

题目大意:Alice和Bob小两口一起出去旅行,他们从0城市出发,Bob喜欢走比较远的路,因为他是个勤奋的好孩子,Alice喜欢走比较近的路,因为她是一个不勤奋的坏孩子,所以有了意见上的分歧,于是乎在出门前他们约法三章,要求说最后的距离值在[l,r]之间,并且由夫妻两轮流做决定,决定说下一个城市去哪里。现在给出n个城市,以及n-1条边,问说在不让Bob媳妇生气的情况下,Bob最远能走多远(不违反约定),如果无法做到不违反约定的话,输出Oh,my
god!

解题思路:树形dp,其实有点像暴力,每个节点其实只会计算一次(树状结构,n-1条边,并且保证联通);

也就是说在题目给出图的时候,就已经确定说各个点所位于的层数,奇数层的肯定是Bob决定,偶数层的肯定是Alice决定。于是在每层计算的时候,有一个x值表示是奇数层还是偶数层,用于确定说是谁在做决定,如果是Bob,肯定选择最大的,如果是Alice肯定选择最小的,但是不管是谁,都要保证说不能违反约定,那么就不能将层与层之间完全分离计算距离,s为跟踪的距离值,用于判断是否违反约定。

#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;
const int N = 500005;
const int INF = 0x3f3f3f3f;

struct node {
	int v, val;
	node(int v = 0, int val = 0) {
		this->v = v;
		this->val = val;
	}
};
vector<node> g[N];

int n, l, r;

void init () {
	for (int i = 0; i < n; i++)
		g[i].clear();

	int a, b, c;
	for (int i = 1; i < n; i++) {
		scanf("%d%d%d", &a, &b, &c);
		g[a].push_back(node(b, c));
	}
}

int solve (int u, int x, int s) {
	if (g[u].size() == 0)
		return s;

	int ans;

	if (x) {
		ans = INF;
		for (int i = 0; i < g[u].size(); i++) {

			int t = solve(g[u][i].v, 1-x, s+g[u][i].val);

			if (t < l || t > r)
				continue;

			ans = min(ans, t);
		}
	} else {
		ans = 0;
		for (int i = 0; i < g[u].size(); i++) {

			int t = solve(g[u][i].v, 1-x, s+g[u][i].val);

			if (t < l || t > r)
				continue;

			ans = max(ans, t);
		}
	}
	return ans;
}

int main () {
	while (scanf("%d%d%d", &n, &l, &r) == 3) {
		init();
		int ans = solve(0, 0, 0);

		if (ans >= l && ans <= r)
			printf("%d\n", ans);
		else
			printf("Oh, my god!\n");
	}
	return 0;
}

uva 1484 - Alice and Bob's Trip(树形dp)

时间: 2024-12-25 09:18:07

uva 1484 - Alice and Bob's Trip(树形dp)的相关文章

UVA1484 Alice and Bob&#39;s Trip (hdu3660)

一.前言 最开始卡这题是某大佬给出的树DP专题中的一个,据说类似于对抗搜索(这是啥?)的一题 但是在经历了若干艰难困苦之后发现这题在HDU上A不了--(先卡vector的时间,后卡输入的时间,上了输入挂还是玄学超时).于是遵从百度到的大佬指点,上UVA上面交了一发,发现500毫秒过得...感觉心好累.... 二.题意 A,B两人计划在一棵树上旅行,A想尽量短,B想尽量长,但是有个区间规定了这个时间长短:L和R.考虑到是B开始出发,于是求能够在L-R区间内得到的最远的距离.如果得不到就输出"Oh,

【HDOJ】3660 Alice and Bob&#39;s Trip

就是一个基本的dfs.可关键问题是c/c++/g++光输入就超时了.还是写java过的,毕竟时限4s.都放弃希望了,没想到还真过了. 1 import java.lang.*; 2 import java.io.*; 3 import java.util.*; 4 5 6 public class Main { 7 8 public static void main(String[] args) throws java.lang.Exception { 9 InputStream inputSt

uva 1500 - Alice and Bob(推理)

题目连接:uva 1500 - Alice and Bob 题目大意:在黑板上又一个序列,每次操作可以选择一个数减1,或者是合并两个数,一个数被减至1则自动消除,不能操作者输. 解题思路:结论,对于大于1的数可以看成是一个整数s,为消除他们的总操作步数,包括减1以及合并,c为列中1的个数,如果s>2的话,c或者是s为奇数则为必胜,否则必败.若s≤2的话(s=2或者s=0)是,判断c是否为3的倍数,是的话必败,不是的话必胜. 证明:s>2时,s和c均为偶数是为必败态. s为奇数,c为偶数:先手操

UVA 1500 - Alice and Bob(博弈)

UVA 1500 - Alice and Bob 题目链接 题意:alice和bob这对狗男女play a game,黑板上有n个数字,每次能把一个数字减1,或者把两个数字合成一个数字,值为两数的和,数字减到0就自动被擦去,最后不能操作的算输,alice先手,问最后谁赢 思路:博弈问题,首先想到一点就很好办了,就是对于非1的所有数,肯定会优先去合并成一个数字的,因为如果当前状态能胜,我优先合并掉,对手不管做什么都无法阻止.然后利用必胜态必败态去进行dp,dp[i][j]记录是有i个1,在非1的堆

UVA - 1500 Alice and Bob (dp+博弈)

Description Alice and Bob are very smart guys and they like to play all kinds of games in their spare time. the most amazing thing is that they always find the best strategy, and that's why they feel bored again and again. They just invented a new ga

uva 1220 - Party at Hali-Bula 【入门树形dp】

题目:uva 1220 - Party at Hali-Bula 题意:一个公司员工要举行聚会,要求任意一个人不能和他的直接上司同时到场,一个员工只有一个支系上司,现在求最多有多少人到场,并且方案是否唯一 分析:分析发现是要求一个树的最大独立集.这里可以用树形dp解决. 定义dp[x][0]:表示在 i 点不选 i 点的以 x 为子树的最大独立集 而dp[x][1] 表示x到场的最大独立集 定义f [x][0]:表示以x为根且x点不选的子树是否唯一 ,f[x][1]表示以x为根且x选的子树是否唯

hdu 4123 Bob’s Race(树形dp+RMQ)

题目链接:hdu 4123 Bob's Race 题目大意:一个城镇有N个住户,N-1条路连接两个住户,保证N个住户联通,M次询问,给定N条边的信息,包括连 接的住户序号以及路的长度.然后是M次询问,每次询问Q,要求找到最长的连续序号,使得Max(dis[i]) - Min(dis[i]) ≤ Q(l≤i≤r),输出最大的r-l+1.dis[i]为从第i个住户出发,不重复走过路能移动的最远距离. 解题思路:树形dp,通过两次dfs,第1次处理出每个节点中孩子节点移动的最长距离和第二长距离,第2次

UVA 12452 Plants vs. Zombies HD SP 树形dp(水

题目链接:点击打开链接 题意: 给定n个点的树[0,n) 开始所有边都是无色. 有3种操作: 1.选一个点染其相连的边 花费100 2.选一个点染其相连的2条边 花费175 3.选一个点染其相连的所有边 花费500 问: 染完所有边的最小花费.边可以重复染,点只能被操作一次. #include <string> #include <iostream> #include <cstdio> #include <algorithm> #include <cm

codeforces_346A Alice and Bob(数学)

题目链接:http://codeforces.com/problemset/problem/346/A 参考链接:http://blog.csdn.net/loy_184548/article/details/50174615 感受到数学在博弈论中的强大. 考虑最后终止状态的序列-无法取出任意两个数他们的差值不存在这个序列中:那么这必定是个首项等于公差的等差序列 而这个序列是 d 2d 3d....,因此可以通过a[1] a[2] a[3] ...的最大公约数得到 然后计算有几个数没在数组中,判