当医院从一个结点A转移到另一个结点B时,实际上B结点自身以及它的子树所有结点的人数距离减一,其它所有结点距离加一。因此求每一个结点的子树的总人数,然后从后往前找到第一个子树总人数大于整棵树总人数的一半的结点,医院就设置在这里。
cin>>n;
for(int i=1;i<=n;i++){
cin>>tree[i][0]>>tree[i][1]>>tree[i][2];
if(tree[i][1])father[tree[i][1]]=i;
if(tree[i][2])father[tree[i][2]]=i;
}
for(int i=n;i>=1;i--)
{
if(tree[i][1])zishuhe[i]+=(zishuhe[tree[i][1]]+tree[tree[i][1]][0]);
if(tree[i][2])zishuhe[i]+=(zishuhe[tree[i][2]]+tree[tree[i][2]][0]);
}
long sum;
sum=zishuhe[1]+tree[1][0];
int t;
for(int i=n;i>=1;i--)if(zishuhe[i]+tree[i][0]>=(sum+1)/2){
t=i;break;
}
不知道这个方法是不是首发。