emmm,树上差分(点差分)裸题,
对于开始选定的根节点,例如本代码中的1号节点,father(1)应该等于0号点或其他处理办法,不能等于本身
最后取一遍max即可
推荐一篇好的文章:差分数组 and 树上差分 (可略去差分数组内容,剩下的自己整理)
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
inline int wread(){
char c(getchar ());int wans(0),flag(1);
while (c<'0' || c>'9'){if (c=='-') flag=-1;c=getchar ();}
while (c>='0' && c<='9'){wans=wans*10+c-'0';c=getchar ();}
return wans*=flag;
}
inline void OUT (int x){
if (x>9) OUT(x/10);
putchar (x%10+'0');
}
inline void init (){
freopen (" ","r",stdin);
freopen (" ","w",stdout);
}
int n,m;
int K,hed[50006];
struct node{int v,nxt;}e[100006];
void ad (int u,int v){
e[++K]=(node){v,hed[u]};hed[u]=K;
}
int p[50006][17];
int dep[50006];
int ans[50006];
void dfs (int x,int fa){
p[x][0]=fa;
for (int i(1);i<=16;++i) p[x][i]=p[p[x][i-1]][i-1];
for (int i(hed[x]);i!=-1;i=e[i].nxt){
int v(e[i].v);
if (v==fa) continue;
dep[v]=dep[x]+1;
dfs (v,x);
}
return ;
}
int lca (int a,int b){
if (dep[a]>dep[b]) swap (a,b);
for (int i(16);i>=0;--i)
if (dep[a]<=dep[p[b][i]]) b=p[b][i];
if (a==b) return a;
for (int i(16);i>=0;--i){
if (p[a][i] == p[b][i]) continue;
a=p[a][i];b=p[b][i];
}
return p[a][0];
}
void getans (int x,int fa){
for (int i(hed[x]);i!=-1;i=e[i].nxt){
int v(e[i].v);
if (v==fa) continue;
getans (v,x);
ans[x]+=ans[v];
}
return ;
}
int main (){
// init ();
memset (hed,-1,sizeof hed);
n=wread();m=wread();
for (int i(1);i<n;++i){
int u(wread()),v(wread());
ad(u,v);ad(v,u);
}
dep[1]=1;
dfs (1,0);
while (m--){
int u(wread()),v(wread());
ans[u]++;ans[v]++;
int lca_uv(lca(u,v));
ans[lca_uv]--;
ans[p[lca_uv][0]]--;
}
getans(1,0);
int pr(0);
for (int i(1);i<=n;++i)
pr=max (pr,ans[i]);
printf("%d\n",pr);
return 0;
}