#include<bits/stdc++.h>
using namespace std;

const int N = 1e4 + 10, M = N << 1, INF = 0x3f3f3f3f;

int n;
int h[N], e[M], w[M], ne[M], idx;

int d1[N], d2[N];
int f1[N], f2[N]; //存下点
int s[N];
void add(int a, int b, int c)
{
	e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}

void dfs1(int u, int fa)
{
	for(int i = h[u]; ~i; i = ne[i])
	{
		int j = e[i];
		if(j == fa) continue;
		dfs1(j, u);
		if(d1[j] + w[i] >= d1[u])
		{
			d2[u] = d1[u], f2[u] = f1[u];
			d1[u] = d1[j] + w[i], f1[u] = j;
		}
		else if(d1[j] + w[i] > d2[u])
		{
			d2[u] = d1[j] + w[i], f2[u] = j;
		}
	}
}

void dfs2(int u, int fa)
{
	for(int i = h[u]; ~i; i = ne[i])
	{
		int j = e[i];
		if(j == fa) continue;
		//次大更新
		if(f1[u] == j)  s[j] = w[i] + max(s[u], d2[u]);
		else s[j] = w[i] + max(s[u], d1[u]);
		
		dfs2(j, u);
	}
}

int main()
{
	memset(h, -1, sizeof h);
	cin >> n;
	for(int i = 1; i < n; i++)
	{
		int a, b, c;
		cin >> a >> b >> c;
		add(a, b, c);
		add(b, a, c);
	}
	
	dfs1(1, -1);
	dfs2(1, -1);
	
	int res = INF;
	for(int i = 1; i <= n; i++)
		res = min(res, max(d1[i], s[i]));
	
	cout << res << endl;
	return 0;
}

/*
1.选择任一结点
2.第一次dfs,统计出当前子树的结点对当前结点的贡献
3.第二次dfs,统计出当前结点的父节点对当前结点的贡献,并合并统计答案。
----
进行dfs的预处理: 当前子树对于根的最大距离,次大距离

原因:不能走回头路

第二次dfs:求出每个结点的父节点和它的距离

两者取max即可。

状态表示:f[1/2][i] 对于i号结点,其子节点贡献为f[1][i], 父节点的贡献为f[2][i]
属性:max

状态计算: f[1][i] = max(f[1][ic] + w);
f[2][i] = max(f[1][ip], f[2][ip] + w)
*/

1 条评论

  • 1