换根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;
}
相关推荐
星火开发设计7 小时前
深度优先搜索(DFS)详解及C++实现
c++·学习·算法·计算机·深度优先·大学生·期末考试
KingRumn8 小时前
玩转DBus命令行工具之gdbus使用
linux·算法
二狗哈8 小时前
Cesium快速入门34:3dTile高级样式设置
前端·javascript·算法·3d·webgl·cesium·地图可视化
@卞8 小时前
排序算法(2)--- 选择排序
算法·排序算法
脏脏a8 小时前
链式存储范式下的二叉树:基础操作实现解析
c语言·数据结构·算法·二叉树
iAkuya8 小时前
(leetcode)力扣100 26环状链表2(双指针)
算法·leetcode·链表
sin_hielo8 小时前
leetcode 2402(双堆模拟,小根堆)
数据结构·算法·leetcode
weixin_461769408 小时前
3. 无重复字符的最长子串
c++·算法·滑动窗口·最长字串
Morwit8 小时前
【力扣hot100】 312. 戳气球(区间dp)
c++·算法·leetcode
CoovallyAIHub8 小时前
摄像头如何“看懂”你的手势?手势识别实现新人机交互
深度学习·算法·计算机视觉