找树的重心和树的直径

重心题

重心就是把这个点删掉后剩下的子树大小最小,siz数组表示以x为根的子树总的大小,maxsiz数组表示以x为根的每个子树的最大的大小,sum表示整个树的大小,那么sum-siz就是除了x为根所有子树外的那颗子树的大小。

代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define fi first
#define se second
const ll mod=1e9+7;
const int N=2e5+10;
#define int ll
const double eps=1e-6;

ll qpow(ll a,ll b){
	ll res=1;
	while(b){
		if(b&1) res=(res*a)%mod;
		a=(a*a)%mod;
		b>>=1;
	}
	return res;
}

int n,sum;
vector<int> v[N];
int siz[N],root,maxsiz[N];

void dfs(int x,int f){
	siz[x]=1;
	for(auto y:v[x]){
		if(y==f) continue;
		dfs(y,x);
		siz[x]+=siz[y];
		maxsiz[x]=max(maxsiz[x],siz[y]);
	}
	maxsiz[x]=max(maxsiz[x],sum-siz[x]);
	if(maxsiz[x]<maxsiz[root])
		root=x;
}
void solve(){
	cin>>n;
	for(int i=1;i<n;i++){
		int x,y;cin>>x>>y;
		v[x].push_back(y);
		v[y].push_back(x);
	}
	sum=maxsiz[root=0]=n;
	dfs(1,0);
	cout<<root<<' '<<maxsiz[root];
}

signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t=1;
    //cin>>t;
	while (t--){
		solve();
	}
	return 0;
}

直径题

两次dfs里的dis最大值就是直径的两端

代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define fi first
#define se second
const ll mod=1e9+7;
const int N=2e5+10;
#define int ll
const double eps=1e-6;

ll qpow(ll a,ll b){
	ll res=1;
	while(b){
		if(b&1) res=(res*a)%mod;
		a=(a*a)%mod;
		b>>=1;
	}
	return res;
}

int n,a[N];
int dis[N],root1,root2;
vector<int>v[N];

void dfs1(int x,int f){
	dis[x]=dis[f]+a[x];
	if(dis[x]>dis[root1]){
		root1=x;
	}
	for(auto y:v[x]){
		if(y==f) continue;
		dfs1(y,x);
	}
}
void dfs2(int x,int f){
	dis[x]=dis[f]+a[x];
	if(dis[x]>dis[root2]){
		root2=x;
	}
	for(auto y:v[x]){
		if(y==f) continue;
		dfs2(y,x);
	}
}
void solve(){
	while(cin>>n){
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		for(int i=1;i<n;i++){
			int x,y;cin>>x>>y;
			v[x].push_back(y);
			v[y].push_back(x);
		}
		dis[root1=n+1]=dis[root2=n+2]=-0x3f3f3f3f;
		dfs1(1,0);
		dfs2(root1,0);
		cout<<dis[root2];
	}
	
}

signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t=1;
    //cin>>t;
	while (t--){
		solve();
	}
	return 0;
}
相关推荐
Coovally AI模型快速验证4 小时前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
pusue_the_sun4 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
RaymondZhao344 小时前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
zhangfeng11335 小时前
DBSCAN算法详解和参数优化,基于密度的空间聚类算法,特别擅长处理不规则形状的聚类和噪声数据
算法·机器学习·聚类
啊阿狸不会拉杆5 小时前
《算法导论》第 32 章 - 字符串匹配
开发语言·c++·算法
小学生的信奥之路6 小时前
洛谷P3817题解:贪心算法解决糖果分配问题
c++·算法·贪心算法
你知道网上冲浪吗7 小时前
【原创理论】Stochastic Coupled Dyadic System (SCDS):一个用于两性关系动力学建模的随机耦合系统框架
python·算法·数学建模·数值分析
地平线开发者8 小时前
征程 6 | PTQ 精度调优辅助代码,总有你用得上的
算法·自动驾驶
Tisfy8 小时前
LeetCode 837.新 21 点:动态规划+滑动窗口
数学·算法·leetcode·动态规划·dp·滑动窗口·概率
CoovallyAIHub9 小时前
为高空安全上双保险!无人机AI护航,YOLOv5秒判安全带,守护施工生命线
深度学习·算法·计算机视觉