https://codeforces.com/problemset/problem/1404/B
Bob赢的充要条件,dist(a,b)>da && db>=2*da+1 && 直径>=2*da+1
第三个条件想了好久还是不太会证明,最后也是猜过的。。。大概就是由于db>=2*da+1,a往b的方向跳,由于dist(a,b)>da,所以b必能跳到某个a达不到的位置,那么次数多了以后,b总能跳到直径的端点上而不被a截住
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=3e5+10;
int n,m,da,db,a,b,cnt,tot,cas,ans;
bool flag;
int tmp[maxl],dis[maxl],disa[maxl],disb[maxl];
int mx[maxl],sec[maxl];
vector<int> e[maxl];
bool vis[maxl];
char s[maxl];
inline void upd(int u,int x)
{
if(x>mx[u])
sec[u]=mx[u],mx[u]=x;
else if(x>sec[u])
sec[u]=x;
}
inline void dfs1(int u,int fa)
{
for(int v:e[u])
{
if(v==fa) continue;
dfs1(v,u);
upd(u,mx[v]+1);
}
}
inline void dfs2(int u,int fa,int fadis)
{
upd(u,fadis);
int tmp;
for(int v:e[u])
{
if(v==fa) continue;
if(mx[v]+1==mx[u])
tmp=sec[u];
else
tmp=mx[u];
tmp=max(tmp,fadis)+1;
dfs2(v,u,tmp);
}
}
inline void prework()
{
scanf("%d",&n);
scanf("%d%d%d%d",&a,&b,&da,&db);
for(int i=1;i<=n;i++)
e[i].clear(),mx[i]=0,sec[i]=0;
int u,v;
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
}
dfs1(1,0);
dfs2(1,0,0);
}
inline void dfs(int u,int dis[])
{
vis[u]=true;
for(int v:e[u])
if(!vis[v])
{
dis[v]=dis[u]+1;
dfs(v,dis);
}
}
inline void mainwork()
{
ans=1;
if(db<2*da+1)
return;
for(int i=1;i<=n;i++) vis[i]=false,disa[i]=0;
dfs(a,disa);
for(int i=1;i<=n;i++) vis[i]=false,disb[i]=0;
dfs(b,disb);
if(disa[b]<=da)
return;
int mxx=0;
for(int i=1;i<=n;i++)
mxx=max(mxx,mx[i]);
if(mxx>=2*da+1)
ans=0;
}
inline void print()
{
if(ans)
puts("Alice");
else
puts("Bob");
}
int main()
{
int t=1;
scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}