Codeforces Round #620 (Div. 2)E(LCA求树上两点最短距离)

LCA求树上两点最短距离,如果a,b之间距离小于等于k并且奇偶性与k相同显然YES;或者可以从a先走到x再走到y再走到b,并且a,x之间距离加b,y之间距离+1小于等于k并且奇偶性与k相同也输出YES;或者从a走到y再走到x再走到b,并且总距离+1小于等于k并且奇偶性与k相同同样输出YES;否则输出NO。

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 int dis[100007];
 5 int cnt;
 6 struct edge{int to,nxt;
 7     //int v;
 8 };
 9 edge e[100007<<1];
10 int tot,head[100007];
11 void adde(int u,int v){
12     e[++tot].to=v;
13     //e[tot].v=w;
14     e[tot].nxt=head[u];
15     head[u]=tot;
16 }
17 int fa[100007][27];
18 int dep[100007];
19 void bfs(int rt){
20     queue<int> q;
21     dep[rt]=0;
22     fa[rt][0]=rt;
23     q.push(rt);
24     while(!q.empty()){
25         int tmp=q.front();q.pop();
26         for(int i=1;i<18;i++)
27             fa[tmp][i]=fa[fa[tmp][i-1]][i-1];
28         for(int i=head[tmp];i;i=e[i].nxt){
29             int v=e[i].to;
30             if(v==fa[tmp][0])continue;
31             dep[v]=dep[tmp]+1;
32             fa[v][0]=tmp;
33             q.push(v);
34         }
35     }
36 }
37 int query_lca(int u,int v){
38     if(dep[u]>dep[v])swap(u,v);
39     int hu=dep[u],hv=dep[v];
40     int tu=u,tv=v;
41     for(int det=hv-hu,i=0;det;det>>=1,i++)
42         if(det&1)tv=fa[tv][i];
43     if(tu==tv)return tu;
44     for(int i=17;i>=0;i--){
45         if(fa[tu][i]==fa[tv][i])continue;
46         tu=fa[tu][i];tv=fa[tv][i];
47     }return fa[tu][0];
48 }
49 int query_kth(int u,int k){
50     for(int det=k,i=0;det;det>>=1,i++)if(det&1)u=fa[u][i];return u;
51 }
52 int query_dist(int a,int b){
53     int lca=query_lca(a,b);
54     return dep[a]+dep[b]-2*dep[lca];
55 }
56 int main(){
57     ios::sync_with_stdio(false);
58     cin.tie(NULL);
59     cout.tie(NULL);
60     int n;
61     cin>>n;
62     for(int i=1;i<n;++i){
63         int u,v;
64         cin>>u>>v;
65         adde(u,v);
66         adde(v,u);
67     }
68     bfs(1);
69     int q;
70     cin>>q;
71     while(q--){
72         int x,y,a,b,k;
73         cin>>x>>y>>a>>b>>k;
74         int dist=query_dist(a,b);
75         if(dist<=k&&dist%2==k%2){
76             cout<<"YES\n";
77             continue;
78         }
79         int dist2=query_dist(a,x);
80         int dist3=query_dist(b,y);
81         if(dist2+dist3+1<=k&&(dist2+dist3+1)%2==k%2){
82             cout<<"YES\n";
83             continue;
84         }
85         int dist4=query_dist(a,y);
86         int dist5=query_dist(b,x);
87         if(dist4+dist5+1<=k&&(dist4+dist5+1)%2==k%2){
88             cout<<"YES\n";
89             continue;
90         }
91         cout<<"NO\n";
92     }
93     return 0;
94 }

 

posted @ 2020-02-16 17:22  sewage  阅读(175)  评论(0编辑  收藏  举报