嘛,比较恶心....
关键在于一个贪心思想....
对 没错 是贪心思想...
直接根据lca的深度排序
然后发现lca深度大的对深度小的影响...
然后就没有了
#include<bits/stdc++.h> #define MAXN 100015 using namespace std; //希望选择最多条路径,并且任何两个路径都不共享公共顶点。 int n,m,tot,ans; int dep[MAXN],f[25][MAXN],h[MAXN]; bool judge[MAXN]; struct node{ int from,to,next; }e[MAXN<<1]; struct node2{ int u,v,la; }q[MAXN<<1]; void init(){ tot=ans=0; memset(judge,false,sizeof(judge)); memset(f,0,sizeof(f)); memset(dep,0,sizeof(dep)); memset(h,-1,sizeof(h)); } void add(int x,int y){ tot++; e[tot].from=x; e[tot].to=y; e[tot].next=h[x]; h[x]=tot; } int dfs(int now,int fa){ dep[now]=dep[fa]+1; for(int i=h[now];i!=(-1);i=e[i].next){ if(e[i].to!=fa){ f[0][e[i].to]=now; dfs(e[i].to,now); } } } void ycl(){ for(int i=1;i<=20;i++){ for(int j=1;j<=n;j++){ f[i][j]=f[i-1][f[i-1][j]]; } } } int lca(int x,int y){ if(dep[x]<dep[y])swap(x,y); int dx=dep[x]-dep[y]; for(int i=0;i<=20;i++){ if(dx&(1<<i)){ x=f[i][x]; } } if(x==y)return x; for(int i=20;i>=0;i--){ if(f[i][x]!=f[i][y]){ x=f[i][x]; y=f[i][y]; } } return f[0][x]; } bool cmp(node2 x,node2 y){ return dep[x.la]>dep[y.la]; } int dfs2(int now){ judge[now]=true; for(int i=h[now];i!=(-1);i=e[i].next){ if(f[0][now]!=e[i].to&&judge[e[i].to]==false){ dfs2(e[i].to); } } } int main(){ while(scanf("%d%d",&n,&m)==2){ init(); for(int i=1;i<n;i++){ int x,y; scanf("%d%d",&x,&y); add(x,y); add(y,x); } dfs(1,1); ycl(); for(int i=1;i<=m;i++){ cin>>q[i].u>>q[i].v; q[i].la=lca(q[i].u,q[i].v); } sort(q+1,q+1+m,cmp); for(int i=1;i<=m;i++){ if(judge[q[i].u]==true||judge[q[i].v]==true)continue; dfs2(q[i].la); ans++; } cout<<ans<<endl; } }