记录每一次分治时,达到重心的dep,加到一个桶中,没添加一个节点,查询桶中是否存在,之后加和和答案取最小值
#include#include #include #include #include #include #include using namespace std;#define N 300505#define ll long longstruct node{ int to,next,val;}e[N<<1];int siz[N],dep[N],ans=1<<30,v[N*5],rot,sum,vis[N],mx[N],head[N],cnt,K,n;ll dis[N];void add(int x,int y,int z){ e[cnt].to=y; e[cnt].next=head[x]; e[cnt].val=z; head[x]=cnt++; return ;}void get_root(int x,int from){ siz[x]=1;mx[x]=0; for(int i=head[x];i!=-1;i=e[i].next) { int to1=e[i].to; if(!vis[to1]&&to1!=from) { get_root(to1,x); siz[x]+=siz[to1]; mx[x]=max(siz[to1],mx[x]); } } mx[x]=max(mx[x],sum-siz[x]); if(mx[x]