参考视频
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
using namespace std;
typedef pair<int, int> PII;
int n,m;
int backup;
const int N = 1e5 + 10 , M = 2 * N , K = 20;
int h[N], e[M], ne[M], idx , w[M];
map<int,int> cnt;
map<PII,int> id;
void add(int a, int b, int c) // 添加一条边a->b,边权为c
{
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}
int depth[N] , fa[N][K];
int q[N];
void bfs(int root)
{
memset(depth,0x3f,sizeof depth);
depth[0] = 0 , depth[root] = 1;
int hh = 0 , tt = 0;
q[0] = root;
while(hh <= tt)
{
int t = q[hh++];
for(int i = h[t];~i;i=ne[i])
{
int j = e[i];
if(depth[j] > depth[t] + 1)
{
depth[j] = depth[t] + 1;
q[++tt] = j;
fa[j][0] = t;
for(int k = 1;k < K;k++)
{
fa[j][k] = fa[fa[j][k-1]][k-1];
}
}
}
}
}
int lca(int a,int b)
{
if(depth[a] < depth[b])swap(a,b);
for(int i = K - 1;i >= 0;i--)
if(depth[fa[a][i]] >= depth[b])
a = fa[a][i];
if(a == b)return a;
for(int i = K - 1;i >= 0;i--)
{
if(fa[a][i] != fa[b][i])
{
a = fa[a][i];
b = fa[b][i];
}
}
return fa[a][0];
}
void cal_sum(int u,int fa)
{
for(int i = h[u];~i;i=ne[i])
{
int j = e[i];
if(j == fa)continue;
cal_sum(j,u);
cnt[u] += cnt[j];
}
}
bool st[N];
int ans = 0;
int main()
{
memset(h, -1, sizeof h);
scanf("%d%d", &n, &m);
backup = m;
for(int i = 0;i < n - 1;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b,i+1) ,add(b,a,i+1);
id[{a,b}] = i + 1 , id[{b,a}] = i + 1;
}
bfs(1);
while (m -- )
{
int a,b;
scanf("%d%d",&a,&b);
//dfs(a,-1,b);
cnt[a] ++ , cnt[b] ++;
cnt[lca(a,b)] -= 2;
}
cal_sum(1,-1);
// for(int i = 1;i <= n ;i++)
// {
// cout << cnt[i] << " ";
// }
// cout << endl;
int ans = -1;
for(int i = 1;i <= n;i++)
{
if(cnt[i] == backup)
{
int ID = id[{i,fa[i][0]}];
ans = max(ans,ID);
}
}
printf("%d",ans);
return 0;
}