Alice and Bob's Trip
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 617 Accepted Submission(s): 169
The city they are visiting has n spots and the spots are connected by directed edges. The spots are connected in such a way that they form a tree and the root will always be at spot 0. They take turns to select which edge to go. Both of them choose optimally. Bob will go first.
There is a blank line after each test case.
Proceed to the end of file.
3 2 4 0 1 1 0 2 5 7 2 8 0 1 1 0 2 1 1 3 1 1 4 10 2 5 1 2 6 5 7 4 8 0 1 1 0 2 1 1 3 1 1 4 2 2 5 1 2 6 5 4 2 6 0 1 1 1 2 1 1 3 5
Oh, my god! 2 6 2
#include<cstdio>
#include<cstring>
const int V=500010;
const int inf=0x7fffffff;
struct EDGE
{
int v,val,next;
}edge[V*2];
int head[V];
int n,l,r;
int e;
void addedge(int u,int v,int c)
{
edge[e].v=v;
edge[e].val=c;
edge[e].next=head[u];
head[u]=e++;
}
int dfs(int u,int sum,int mark)
{
int v,w;
if(mark==1)
{
int big=-1;
for(int i=head[u];i!=-1;i=edge[i].next)
{
v=edge[i].v;
w=edge[i].val;
if(sum+w>r) continue;
if(head[v]==-1)
{
if(sum+w<l) continue;
if(sum+w>big) big=sum+w;
}
else
{
int t=dfs(v,sum+w,0);
if(t==-1) continue;
if(t>big) big=t;
}
}
if(big==-1) return -1;
else return big;
}
else
{
int sam=inf;
for(int i=head[u];i!=-1;i=edge[i].next)
{
v=edge[i].v;
w=edge[i].val;
if(sum+w>r) continue;
if(head[v]==-1)
{
if(sum+w<l) continue;
if(sum+w<sam) sam=sum+w;
}
else
{
int t=dfs(v,sum+w,1);
if(t==-1) continue;
if(t<sam) sam=t;
}
}
if(sam!=inf) return sam;
else return -1;
}
}
int main()
{
while(scanf("%d%d%d",&n,&l,&r)!=EOF)
{
e=0;
memset(head,-1,sizeof(head));
for(int i=1;i<n;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);
}
int t=dfs(0,0,1);
if(t<=r&&t>=l) printf("%d/n",t);
else printf("Oh, my god!/n");
}
return 0;
}