#include using namespace std; #define maxn 50010 struct node { int to, next; } edge[maxn << 1]; int fa[maxn][30], head[maxn << 1]; int power[maxn]; int depth[maxn], lg[maxn]; int n, k, ans = 0, tot = 0; void add(int x, int y) { // 加边 edge[++tot].to = y; edge[tot].next = head[x]; head[x] = tot; } void dfs(int now, int father) { // dfs求最大压力 fa[now][0] = father; depth[now] = depth[father] + 1; for (int i = 1; i <= lg[depth[now]]; ++i) fa[now][i] = fa[fa[now][i - 1]][i - 1]; for (int i = head[now]; i; i = edge[i].next) if (edge[i].to != father) dfs(edge[i].to, now); } int lca(int x, int y) { // 求LCA,最近公共祖先 if (depth[x] < depth[y]) swap(x, y); while (depth[x] > depth[y]) x = fa[x][lg[depth[x] - depth[y]] - 1]; if (x == y) return x; for (int k = lg[depth[x]] - 1; k >= 0; k--) { if (fa[x][k] != fa[y][k]) x = fa[x][k], y = fa[y][k]; } return fa[x][0]; } // 用dfs求最大压力,回溯时将子树的权值加上 void get_ans(int u, int father) { for (int i = head[u]; i; i = edge[i].next) { int to = edge[i].to; if (to == father) continue; get_ans(to, u); power[u] += power[to]; } ans = max(ans, power[u]); } int main() { scanf("%d %d", &n, &k); int x, y; for (int i = 1; i <= n; i++) { lg[i] = lg[i - 1] + (1 << lg[i - 1] == i); } for (int i = 1; i <= n - 1; i++) { // 建图 scanf("%d %d", &x, &y); add(x, y); add(y, x); } dfs(1, 0); int s, t; for (int i = 1; i <= k; i++) { scanf("%d %d", &s, &t); int ancestor = lca(s, t); // 树上差分 power[s]++; power[t]++; power[ancestor]--; power[fa[ancestor][0]]--; } get_ans(1, 0); printf("%d\n", ans); return 0; }