hdoj 3660 Alice and Bob's Trip(树dp)

原创 2012年03月25日 01:03:40

【题目大意】:给出一棵n个结点的树,两个人一起走,轮流决策。Alice目的是使最后距离最小,Bob则要最大。问最终走的距离能否满足区间[L,R](需要走到最后不能走,所以Alice不能不选就结束了)


【解题思路】:第一次见到这道题是去年的暑假,当初一直把它当初博弈去找必胜态和必败态,然后徒劳无功。

 下午队友把这道题切了,G++交必须用恶心的输入外挂....回来之后,顺手自己也把它写了一下,有向图很好写,O(n)而已。

                  我们设dist[u]记录0到u的距离,dp[u]记录u这点开始最终走的距离。

                  在dist[u]+dp[v]+w也就是0到u的距离,加上v开始的距离,和u到v的距离是在[L,R]之间,则进行状态的转移,也就是Alice会取min(dp[u],dp[v]+w),Bob会取max(dp[u],dp[v]+w)...

注释部分是输入挂...

【代码】:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <string>
#include <cctype>
#include <map>
#include <iomanip>
                   
using namespace std;
                   
#define eps 1e-8
#define pi acos(-1.0)
#define inf 1<<30
#define linf 1LL<<60
#define pb push_back
#define lc(x) (x << 1)
#define rc(x) (x << 1 | 1)
#define lowbit(x) (x & (-x))
#define ll long long

int n,le,ri;
int tot,eh[600000];
int dp[500500],dist[500500];

struct Edge {
    int v,w,next;
}et[600000];

/*int getint(){
    char c=getchar();
    int t=0;
    while (c<'0' || c>'9') {
        c=getchar();
    }
    while (c>='0' && c<='9') {
        t=t*10+c-'0';
        c=getchar();
    }
    return t;
}*/

void init() {
    tot=0;
    memset(eh,-1,sizeof(eh));
}

void addedge(int u,int v,int w) {
    Edge e={v,w,eh[u]};
    et[tot]=e;
    eh[u]=tot++;
}

void dfs(int u,int who) {
    dp[u]=0;
    for (int i=eh[u]; i!=-1; i=et[i].next) {
        int v=et[i].v,w=et[i].w;
        dist[v]=dist[u]+w;
        dfs(v,!who);
        if(dist[u]+dp[v]+w>=le && dist[u]+dp[v]+w<=ri) {
            if(who || dp[u]==0) dp[u]=max(dp[u],dp[v]+w);
                else dp[u]=min(dp[u],dp[v]+w);
         }
    }
    return ;
}

int main() {
    int u,v,w,i;
    while(~scanf("%d%d%d",&n,&le,&ri)) {
        init();
        memset(dist,0,sizeof(dist));
        for(int i=1; i<n; i++) {
            //u=getint(); v=getint(); w=getint();
            scanf("%d%d%d",&u,&v,&w);
            addedge(u,v,w);
        }
        dfs(0,1);
        if(ri<le || dp[0]<le || dp[0]>ri) printf("Oh, my god!\n");
        else printf("%d\n",dp[0]);
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

hdoj 3660 Alice and Bob's Trip

类型:树形DP 题目:http://acm.hdu.edu.cn/showproblem.php?pid=3660 来源:2010 Asia Regional Harbin 思路:令状态dp[i...

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...

树形dp-hdu-3660-Alice and Bob's Trip

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3660 题目意思: Alice和Bob两个人从根0出发,轮流选择路径,Bob开始选,在满足总距离在区...

uva-1484(hdu-3660) Alice and Bob's Trip 听说是树形dp

下午组队赛遇到的题,是在hdu上判,一直在超时,各种优化之后还是超时,最后无奈从别人博客上贴代码交,竟然还是超时,但是后来我在uva 上交,我的代码只跑了300多ms,呵呵……,然后我看那个题在hdu...

HDU 3660 Alice and Bob's Trip

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

HDU 3660 Alice and Bob's Trip

/* 题目大意:Alice 和 Bob在一颗树上轮流走,每天边有一定的权值,Alice想走的权值和尽量小,Bob想走尽量大,同时所走的权值和必须在[L, R]这个给定的区间内,Bob先走。求Bob能...

hdu 3660 Alice and Bob's Trip

题意:alice和bob轮流在一棵树上(有向)选道路走,alice会尽量让总路程短,bob会尽量让总路程长,但是他们俩都要保证总路程要在[L,R]的区间内,bob先走,问bob能走的最远距离。 思路...

codeforces round 396 div2 E Mahmoud and a xor trip 按位操作+dp子树内外

d every city with greater index as a finish. They want to know the total distance between all pairs ...

HDOJ 4268 Alice and Bob(贪心)

/* 第一次使用集合set 这一类问题思路:对这2*n个元素进行排序,排序时候需要注意一点,如果h、w都相等时候,第二类需要排到前面。 然后贪心,历遍所有元素,如果是第二类元素,进入集合;是第一类元素...

hdoj4268 Alice and Bob (multiset +贪心)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4268 题意:女生和男生各有n张牌,牌的高和宽分别为h,w,当女生的牌的高和宽分别大于等于男生的高和宽时表...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)