ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【】树的直径与重心

2022-07-20 07:31:08  阅读:167  来源: 互联网

标签:diameter head 重心 int tot edge dfs 直径


树的直径

\(2dfs\)

定理:在一棵树上,从任意节点\(x\)开始进行一次 DFS,到达的距离其最远的节点\(y\)必为直径的一端。

#include <stdio.h>

const int V = 1024;
const int E = 4096;

struct EDGE {
	int t, next, w;
} edge[E];
int edge_tot, head[V];
void add_edge(int f,int t,int w) {
	edge[++edge_tot].next = head[f];
	edge[edge_tot].t = t;
	edge[edge_tot].w = w;
	head[f] = edge_tot;
}

int dis[V], side;
void dfs(int u,int p) {
	for(int i = head[u];i;i = edge[i].next) {
		int v = edge[i].t;
		if(v == p) continue;
		dis[v] = dis[u]+edge[i].w;
		if(dis[v] > dis[side]) 
			side = v;
		dfs(v,u);
	}
}

int get_diameter() {
	dfs(1,0);
	dis[side] = 0;
	dfs(side,0);
	return dis[side];
}

int n, m;
signed main() {
	scanf("%d",&n);
	for(int i = 1, a, b, c;i < n;++i) {
		scanf("%d %d %d\n",&a,&b,&c);
		add_edge(a,b,c);
		add_edge(b,a,c);
	}
	int diameter = get_diameter();
	printf("%d\n",diameter);
}

树形\(DP\)

#include <stdio.h>
#include <bits/stl_algobase.h>

const int V = 1024;
const int E = 4096;

struct EDGE {
	int t, next, w;
} edge[E];
int edge_tot, head[V];
void add_edge(int f,int t,int w) {
	edge[++edge_tot].next = head[f];
	edge[edge_tot].t = t;
	edge[edge_tot].w = w;
	head[f] = edge_tot;
}

int d1[V], d2[V], diameter;
void dfs(int u,int p) {
	d1[u] = d2[u] = 0;
	for(int i = head[u];i;i = edge[i].next) {
		int v = edge[i].t;
		if(v == p) continue;
		dfs(v,u);
		int d = d1[v]+edge[i].w;
		if(d > d1[u]) {
			d2[u] = d1[u];
			d1[u] = d;
		} else if(d > d2[u]) {
			d2[u] = d;
		}
	}
	diameter = std :: max(diameter,d1[u]+d2[u]);
}

int get_diameter() {
	dfs(1,0);
	return diameter;
}

int n, m;
signed main() {
	scanf("%d",&n);
	for(int i = 1, a, b, c;i < n;++i) {
		scanf("%d %d %d\n",&a,&b,&c);
		add_edge(a,b,c);
		add_edge(b,a,c);
	}
	int diam = get_diameter();
	printf("%d\n",diam);
}

@\(\color{black}{bikuhiku}\)

标签:diameter,head,重心,int,tot,edge,dfs,直径
来源: https://www.cnblogs.com/bikuhiku/p/diameter_centroid.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有