#include<stdio.h>
#include<cstdlib>
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
typedef long long LL;
int max(int a, int b) {
return a > b ? a : b;
}
typedef struct node
{
int to, cost;
}edge;
vector<edge>G[10001];
int dis[10001] = { 0 }, used[10001] = { 0 };
void dfs(int i) {
used[i] = 1;
if (G[i].size() == 0)return;
int s = G[i].size();
for (int j = 0; j < s; j++) {
if (used[G[i][j].to] == 0) {
dis[G[i][j].to] = dis[i] + G[i][j].cost;
dfs(G[i][j].to);
}
}
}
int main() {
int a, b, c;
int Max=0;
while (~scanf_s("%d%d%d", &a, &b, &c)) {
edge C; C.to = b, C.cost = c;
edge D; D.to = a, D.cost = c;
Max = max(b, max(Max, a));
G[a].push_back(C);
G[b].push_back(D);
}
dfs(1);
int start, mdis = 0;
for (int i = 1; i <= Max; i++) {
if (mdis < dis[i]) {
start = i;
mdis = dis[i];
}
}
memset(dis, 0, sizeof(dis));
memset(used, 0, sizeof(used));
dfs(start);
mdis = 0;
for (int i = 1; i <= Max; i++) {
mdis = max(dis[i], mdis);
}
printf("%d\n", mdis);
}
树的直径:树中距离最远的两个节点之间的距离
求树的直径只需要两边dfs即可,第一遍dfs求出距离起点最远的一个端点,这个端点就是树的直径的一端(证明。。。),第二遍dfs从这个端点开始,距离这个端点距离最大值就是树的直径。