换根DP模板

给你一个无根树,问你以哪个节点为根节点的时候得到所有点的深度之和最大

《贴一张 知乎大佬的一个解释》

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N = 2e6+10;
using ll = long long;
ll dep[N],sz[N];
ll ans[N];
vector<int>g[N];
int n;

void dfs(int u,int father){
	sz[u] = 1;
	dep[u] = dep[father]+1;
	for(auto &t:g[u]){
		if(t==father)continue;
		dfs(t,u);
		sz[u]+=sz[t];
	}	
}


void down(int u,int father){
	
	for(auto &t:g[u]){
		if(t==father)continue;
		ans[t] = ans[u]-2*sz[t]+sz[1];
		down(t,u);
	}
}


int main()
{
	cin>>n;
	for(int i=1;i<n;i++){
		int a,b;cin>>a>>b;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	
	dfs(1,0);
	for(int i=1;i<=n;i++)ans[1]+=dep[i];
	//for(int i=1;i<=n;i++)cout<<sz[i]<<"\n";
	down(1,-1);
	ll res = ans[1],p = 1;
	for(int i=1;i<=n;i++)if(ans[i]>res)res=ans[i],p=i;
	cout<<p;
}
相关推荐
JieE21215 小时前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2122 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack202 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树2 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2123 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2123 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术3 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦3 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050733 天前
(一)小红的数组操作
算法·编程语言