先放代码:
struct edge{
vector<int> w, n;
}e[10001];
int d[10001];
void dfs(int now, int &p, int fat) {
for(int x=0; x<e[now].n.size(); x++) {
int i=e[now].n[x];
if(i==fat) continue;
d[i]=d[now]+e[now].w[x];
if(d[i]>d[p]) p=i;
dfs(i, p, now);
}
}
dfs(0, p, 0);
d[p]=0;
dfs(p, p, 0);
cout<<d[p];
这里,e数组存放树中的边,对于任一i,e[i]中个变量意义如下:
⎩⎨⎧ie[i].n[j]e[i].w[j] 边的起点 边的终点 该边(i→e[i].n[j])的权值
其他可看代码注释
相关理论证明:
oi-wiki.org