测试点跳转
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000010;
int n, A, s, fa[MAXN][20]={{0}}, dep[MAXN], sum[MAXN] = {0}, ans=0;
vector <int> edge[MAXN];
void dfs(int node, int father){
dep[node] = dep[father] + 1;
fa[node][0] = father;
for (int i=1;i<20;++i) {
fa[node][i] = fa[fa[node][i-1]][i-1];
}
for (auto son : edge[node]){
if (son != father) dfs(son, node);
}
}
int lca(int node1, int node2){
if (dep[node1] < dep[node2]) swap(node1, node2);
for (int i=19;i>=0;i--){
if ((dep[node1] - dep[node2]) & (1 << i)) {
node1 = fa[node1][i];
}
}
if (node1 == node2) return node1;
for (int i=19;i>=0;i--){
if (fa[node1][i] != fa[node2][i]){
node1 = fa[node1][i];
node2 = fa[node2][i];
}
}
return fa[node1][0];
}
void adder(int node, int father){
for (auto son : edge[node]){
if (son != father){
adder(son, node);
sum[node] += sum[son];
}
}
}
int main(){
cin>>n>>A;
for (int i=1;i<n;++i){
int u, v;
cin>>u>>v;
edge[u].push_back(v);
edge[v].push_back(u);
}
dep[0] = 0;
dfs(0, 0);
for (int i=1;i<=A;++i){
int a, b;
cin>>a>>b;
int lca_ab = lca(a, b);
sum[a]++;
sum[b]++;
sum[lca_ab]--;
sum[fa[lca_ab][0]]--;
}
adder(1, 0);
int badA, badB;
cin>>badA>>badB;
int bad_lca = lca(badA, badB);
while (badA != bad_lca){
if (sum[badA] == 0){
ans++;
}
badA = fa[badA][0];
}
while (badB != bad_lca){
if (sum[badB] == 0){
ans++;
}
badB = fa[badB][0];
}
if (fa[bad_lca] == 0){
ans++;
}
cout<<ans;
return 0;
}