```
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,first[100010],m,tot1,lg[100010],deep[100010],fa[100010][21],d[100010];
int maxn;
struct edge
{ int ed,nxt;}e[100010];
int fadd(int x,int y)
{ e[++tot1].ed=y;e[tot1].nxt=first[x];first[x]=tot1;
return 0;
}
int dfs(int x,int bef)
{
deep[x]=deep[bef]+1;
fa[x][0]=bef;
int i;
for(i=1;(1<<i)<=deep[x];i++)
fa[x][i]=fa[fa[x][i-1]][i-1];
for(i=first[x];i!=-1;i=e[i].nxt)
{
int y=e[i].ed;
if(y==bef)
continue;
dfs(y,x);
}
return 0;
}
int lca(int x,int y)
{ if(deep[x]<deep[y])
swap(x,y);
/*for(int i=lg[deep[x]-deep[y]]-1;i=0;i--)
{
if(fa[x][i]<deep[y])
continue;
else x=fa[x][i];}*/
while(deep[x]>deep[y])
x=fa[x][lg[deep[x]-deep[y]]-1];
if(x==y)
return y;
for(int i=lg[deep[x]]-1;i=0;i--)
{
if(fa[x][i]!=fa[y][i])
x=fa[x][i],y=fa[y][i];
}
return fa[x][0];
}
int dfs1(int x,int bef)
{ int i,now=d[x];
for(i=first[x];i!=-1;i=e[i].nxt)
{
int y=e[i].ed;
if(y==bef)
continue;
now+=dfs1(y,x);
}
maxn=max(maxn,now);
return now;
}
int main()
{ freopen("A.in","r",stdin);
freopen("A.out","w",stdout);
int i,x,y,j;
memset(first,-1,sizeof(first));
scanf("%d%d",&n,&m);
for(i=1;i<=n-1;i++)
{ scanf("%d%d",&x,&y);
fadd(x,y);fadd(y,x);
}
for(i=1;i<=n;i++)
{
lg[i]=lg[i-1];
if(i==(1<<lg[i-1]))
lg[i]++;
}
dfs(1,0);
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
d[x]++;d[y]++;d[lca(x,y)]--;d[fa[lca(x,y)][0]]--;}
x=dfs1(1,0);
printf("%d",maxn);
return 0;
}
```
by Barcelona_Messi @ 2019-11-10 22:35:40
for循环的边界是不是应该改成 "==" 啊, "=" 不是赋值吗...
by 蘸醋的三文鱼 @ 2019-11-10 23:06:22
lca函数最后一个循环里面
by Azazеl @ 2019-11-11 22:22:40