感觉可以O(n)确定医院的位置,本题AC了
查看原帖
感觉可以O(n)确定医院的位置,本题AC了
520309
yuan1fan楼主2021/12/5 13:24

当医院从一个结点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;//医院建在t处
for(int i=n;i>=1;i--)if(zishuhe[i]+tree[i][0]>=(sum+1)/2){
	t=i;break;
}

不知道这个方法是不是首发。

2021/12/5 13:24
加载中...