0
点赞
收藏
分享

微信扫一扫

【算法模板】树的直径

三千筱夜 2022-04-30 阅读 59

一般解法是两次搜索,第一次求离根节点最远的点A,第二次求里点A最远的点B。

A与B之间的距离就是树的直径。

#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,d[N]={-1},deepest;
vector<int> edges[N]; // vector存图
void add(int u,int v) { edges[u].push_back(v); } // 简单加边
void dfs(int now,int fa) {
	d[now]=d[fa]+1; // 深度=父亲+1
	if (d[now]>d[deepest]) deepest=now; // 获取最深节点
	for (int i=0,v;i<edges[now].size();i++) // 遍历每一条边
		if ((v=edges[now][i])!=fa) dfs(v,now); // 如果是father就可以不用dfs
}

int main() {
	cin>>n;
	for (int i=1,u,v;i<n;i++) cin>>u>>v,add(u,v),add(v,u); // 双向加边
	dfs(1,0),dfs(deepest,0); // 二次dfs
	cout<<d[deepest]<<endl; // 最深节点的d就是答案
	return 0;
}
举报

相关推荐

0 条评论