1. 程式人生 > >UVA1484 Alice and Bob's Trip (hdu3660)

UVA1484 Alice and Bob's Trip (hdu3660)

思路 put with 。。 距離 != name back scanf

一、前言

  最開始卡這題是某大佬給出的樹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=502333;

//vecp G[MAXN];

inline void read_int(int &ret)
{
    ret=0;
    char c=getchar();
    while(c>9||c<0)c=getchar();
    
while(c<=9&&c>=0)ret=ret*10+c-0,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*3]; 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==-1||a>b ? b:a; } void checkMax(ll &a,ll b) { a= a==-1||a<b ? b:a; } void dfs(int now,int last,ll maxx,bool isBob) { // int len=G[now].size(); dp[now]=-1; for(int i=number[now];i!=-1;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]==-1)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]==1&&dp[now]==-1)dp[now]=0; // if(len==1&&dp[now]==-1)dp[now]=0; } void init() { memset(number,-1,4*(n+1)); memset(cnt,0,4*(n+1)); size=0; for(int i=1;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(0,-1,0,1); if(dp[0]!=-1)printf("%d\n",dp[0]); // 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 0; }

UVA1484 Alice and Bob's Trip (hdu3660)