目录
树的直径是指树中最长的一条路径的长度,这条路径连接树中的两个节点,使得它们之间的距离最远。

P3304 [SDOI2013] 直径 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
- #include
- using namespace std;
- const int maxn=2e5+5;
- int n;
- struct Edge{
- int u,v,w,next;
- }edge[maxn<<1];
- int head[maxn],cnt;
- void add(int u,int v,int w){
- edge[++cnt]=(Edge){u,v,w,head[u]}; head[u]=cnt;
- }
- int root,lon;
- void dfs(int u,int fa,int p){
- if(p>lon){
- root=u;
- lon=p;
- }
- for(int i=head[u];i;i=edge[i].next){
- int v=edge[i].v;
- if(v==fa) continue;
- dfs(v,u,p+edge[i].w);
- }
- }
- int main(){
- scanf("%d",&n);
- for(int i=1,u,v,w;i
- scanf("%d%d%d",&u,&v,&w);
- add(u,v,w); add(v,u,w);
- }
- dfs(1,0,0);
- lon=0;
- dfs(root,0,0);
- printf("%d",lon);
- return 0;
- }
二.树的重心
(1)介绍
树的重心是指树中的一个节点,通过删除该节点后,将树分成多个子树,使得每个子树的节点数都不超过整棵树节点数的一半。换句话说,树的重心是树的一种结构特征,它能够将树尽可能平衡地分割成多个相对均匀的部分。
说人话就是重心在树所有节点中,它的最大子树的节点最小
寻找树的重心通常可以通过以下步骤来实现:
- 选择任意一个节点作为树的根节点。
- 对树进行深度优先搜索(DFS)或广度优先搜索(BFS),计算每个节点的子树大小(包括自身节点)。
- 对于每个节点,计算删除该节点后,各个子树的大小(即除去该节点后,以其邻居节点为根的子树大小)。
- 找到一个节点,使得删除该节点后,各个子树的大小都不超过整棵树节点数的一半。这个节点就是树的重心。
(2)求重心
- #include
- #define maxn 10005
- using namespace std;
- int n;
- int size[maxn],f[maxn]; //子树总大小 && 最大子树
- struct Edge{
- int u,v,next;
- }edge[maxn<<1];
- int head[maxn],cnt;
- void add(int u,int v){
- edge[++cnt]=(Edge){u,v,head[u]}; head[u]=cnt;
- }
- int root,MAX=0x7fffffff;
- void dfs(int u,int fa){
- size[u]=1;
- for(int i=head[u];i;i=edge[i].next){
- int v=edge[i].v;
- if(v!=fa){
- dfs(v,u);
- size[u]+=size[v];
- f[u]=max(f[u],size[v]);
- }
- }
- f[u]=max(f[u],n-size[u]);
- if(f[u]
- MAX=f[u];
- root=u;
- }
- }
-
- int main(){
- scanf("%d",&n);
- int x,y;
- for(int i=1;i
- scanf("%d%d",&x,&y);
- add(x,y); add(y,x);
- }
- dfs(1,0);
- printf("%d",root);
- return 0;
- }
(3)例题
P1395 会议 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
(4)AC
- #include
- #define maxn 50005
- using namespace std;
- int n;
- int size[maxn],f[maxn]; //子树总大小 && 最大子树
- struct Edge{
- int u,v,w,next;
- }edge[maxn<<1];
- int head[maxn],cnt;
- void add(int u,int v,int w){
- edge[++cnt]=(Edge){u,v,w,head[u]}; head[u]=cnt;
- }
- int root,MAX=0x7fffffff;
- void dfs(int u,int fa){
- size[u]=1;
- for(int i=head[u];i;i=edge[i].next){
- int v=edge[i].v;
- if(v!=fa){
- dfs(v,u);
- size[u]+=size[v];
- f[u]=max(f[u],size[v]);
- }
- }
- f[u]=max(f[u],n-size[u]);
- if(f[u]
- MAX=f[u];
- root=u;
- }
- }
- struct node{
- int u,w;
- bool operator < (const node &x) const{
- return x.w
- }
- };
- int dis[maxn],vis[maxn];
- void Djkstra(){
- for(int i=1;i<=n;i++) dis[i]=0x7fffffff;
- dis[root]=0;
- priority_queue
q; - q.push((node){root,0});
- while(!q.empty()){
- node temp=q.top(); q.pop();
- int u=temp.u;
- if(vis[u]) continue;
- vis[u]=1;
- for(int i=head[u];i;i=edge[i].next){
- int v=edge[i].v,w=edge[i].w;
- if(dis[u]+w
- dis[v]=dis[u]+w;
- q.push((node){v,dis[v]});
- }
- }
- }
- }
- int main(){
- scanf("%d",&n);
- int x,y;
- for(int i=1;i
- scanf("%d%d",&x,&y);
- add(x,y,1); add(y,x,1);
- }
- dfs(1,0);
- printf("%d ",root);
- Djkstra();
- long long ans=0;
- for(int i=1;i<=n;i++) ans+=dis[i];
- printf("%lld",ans);
- return 0;
- }
-
相关阅读:
JAVA计算机毕业设计手办销售系统源码+系统+mysql数据库+lw文档
Dubbo:服务调用
热烈祝贺埃文科技代码特工队斩获2023黄河鲲鹏开发者大赛河南赛区创新赛道二等奖
Spring - Spring Cloud Gateway网关实战及原理解析
Flutter实现地图上汇聚到一点的效果。
前端怎么debugger排查线上问题
Windows线程简介
【学习笔记-李宏毅】GAN(生成对抗网络)全系列(一)
QML语法基础三
探索Linux中的fdisk命令:磁盘分区管理的利器
-
原文地址:https://blog.csdn.net/qq_49705495/article/details/133584127