It's quite interesting .... Consider the contribution of each side.
#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#defineMAXV 200500#defineMaxe 400500using namespacestd;intN,k,x,y,nume=0, G[MAXV],SIZE[MAXV],FATH[MAXV];Long Longans=0;BOOLVIS[MAXV];structedge{intV,NXT;} E[maxe];voidAddedge (intUintv) {e[++nume].v=v; E[NUME].NXT=G[u]; G[u]=Nume;}voidDFS1 (intx) {Size[x]=0; for(intI=g[x];i;i=e[i].nxt) { intv=e[i].v; if(v!=Fath[x]) {Fath[v]=x; DFS1 (v); SIZE[X]+=Size[v]; } } if(Vis[x]) size[x]++;}voidDFS2 (intx) { for(intI=g[x];i;i=e[i].nxt) { intv=e[i].v; if(v!=Fath[x]) {ans+=min (Size[v],2*k-Size[v]); DFS2 (v); } }}intMain () {scanf ("%d%d",&n,&k); for(intI=1; i<=2*k;i++) {scanf ("%d", &x); vis[x]=true;} for(intI=1; i<=n-1; i++) {scanf ("%d%d",&x,&y); Addedge (x, y); Addedge (y,x); } DFS1 (1); DFS2 (1); printf ("%i64d\n", ans); return 0;}
Codeforces 700B Connecting Universities