首页 > 其他分享 >树的直径

树的直径

时间:2024-08-26 14:36:36浏览次数:4  
标签:pas int dfs 直径 lth 负权 mx

树的直径即为一棵树上的最长链。一般分为有负权图和无负权图来考虑。

无负权
只需做两次dfs。
第一次是搜索出从任一点出发到达的最远的点P,那么这个点就一定在最长链上(请自证)。
第二次搜索从点P出发到达的最远的点Q,那么最长链即为P与Q的距离。

题目:B4016 树的直径

代码:

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, lth[N], ans, mx, pas;
vector <int> e[N];
void dfs(int u, int fa)
{
	lth[u] = lth[fa] + 1;
	if(lth[u] > mx) mx = lth[u], pas = u;
	for(int i = 0; i < e[u].size(); i ++)
	{
		if(e[u][i] == fa) continue;
		dfs(e[u][i], u);
	}
}
int main()
{
	cin >> n;
	int u, v;
	for(int i = 1; i < n; i ++)
	{
		scanf("%d %d", &u, &v);
		e[u].push_back(v), e[v].push_back(u);
	}
	dfs(1, 0);
	mx = 0;
	memset(lth, 0, sizeof(lth));
	dfs(pas, 0);
	ans = mx;
	cout << ans - 1 << endl;
	return 0;
}

标签:pas,int,dfs,直径,lth,负权,mx
From: https://www.cnblogs.com/Lion-Wu/p/18381003

相关文章

  • 树的直径
    树的直径树上任意两节点之间最长的简单路径即为树的直径。即树上最长的链显然树可以有多条直径SPOJPT07Z模版树的直径两种求法,时间复杂度均为\(O(n)\)常用的是两遍dfs第一遍dfs从任一点开始,找到可以到达的最远点,这个最远点就是直径的一个端点,第二遍dfs再从这一端点出发,再......
  • AcWing 1078. 旅游规划 (DFS找树的直径+直径中点性质求解,无DP)
    原题链接题目描述算法引用自树的直径-OI-Wiki:若树上所有边边权均为正,则树的所有直径中点重合证明:使用反证法。设两条中点不重合的直径分别为\(\delta(s,t)与\delta(s',t')\),中点分别为\(x\)与\(x'\)。显然,\(\delta(s,x)=\delta(x,t)=\delta(s',x')=\delta(......
  • 『树的直径、重⼼』Day10
    DrazilandMorningExercise\(f\)可以换根求。对于一段乱序序列,你不好求其中max-min的限制。根据重心的性质,如果你让重心为root,那么向下\(f\)一定单减。这样,你就对每个点在末尾的情况,树上倍增找到最大的点,树上差分即可。现在想到了好像可以线段树合并,那么你当前点就......
  • 【题解】Solution Set - NOIP2024集训Day10 树的直径、重⼼、中⼼
    【题解】SolutionSet-NOIP2024集训Day10树的直径、重⼼、中⼼https://www.becoder.com.cn/contest/5464「CF516D」DrazilandMorningExercise首先,我们可以换根求出所有点的\(f\)。然后不会了……思考一下,一条直径提供的到底时什么。实际上,一条直径上的点取到\(f\)......
  • 【算法模板】计算几何:旋转卡壳求凸包直径
    旋转卡壳算法是一种几何算法,主要用于在二维平面上求解与凸包相关的最优问题。该算法利用凸包顶点的顺序性和对称性,通过模拟两个卡壳(calipers)沿着凸包边界的旋转来寻找最优解。常见的应用包括计算凸包的直径(即最远点对之间的距离)、最小包围矩形(最小面积矩形),以及最小宽度(宽度......
  • 【树的直径 求树中距离跟阶段点最远的点】CodeForce1822F.md
    CF1822F-Problem-F-Codeforces题目大意:无根树的每条边为k,定义操作:移动根节点为把当前的根ROOT移动到相邻节点,每次代价为c,定义成本=从ROOT出发到达的最长的路径的长度,利润=成本-代价,求利润最大值\[\begin{align}&\huge\color{red}记得开\text{longlong}\\\\\\&\huge思......
  • 浅谈图论中树及其相关知识点(树的遍历、直径、最近公共祖先)(c++)
    目录前言一.关于树二.树的遍历(一)遍历方式常见遍历1.DFS遍历2.BFS遍历二叉树遍历1.先序遍历2.中序遍历3.后序遍历(二)例题讲解1.P1030[NOIP2001普及组]求先序排列思路AC代码 2.P5908猫猫和企鹅思路AC代码  3.P1395会议思路AC代码三.树的直径(一)定......
  • P3304 [SDOI2013] 直径
    原题链接题解先随便找一条直径,然后标记这些边,然后看看直径上的点有没有不需要经过标记边的路径,使得其长度等于该点到直径端点的路径长度code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;structedge{llto,val;};vector<edge>G[200005];l......
  • 树的直径
    树的直径可能不是唯一的,但树的中点是唯一的,我的意思是..U81904【模板】树的直径有以下两种办法求得树的直径:两遍DFS(或BFS):可以记录点树形DP:允许有负边权首先是两遍DFS可求路径点击查看代码inthead[N],cnt;structEdge{intfrom,to,nxt;llval;......
  • CF911F-构造、树直径
    link:https://codeforces.com/contest/911/problem/F给一棵树,你需要进行若干次操作:选择两个叶子,把他们的距离加入得分,删掉其中一个叶子。希望让最终得分最大。构造方案。删叶子,距离最大,考虑树的直径很明显用树的直径不会让答案更劣(一棵树可能有多个直径,但直径的中心是唯一的,在......