题目链接:[蓝桥杯 2013 省 A] 大臣的旅费 - 洛谷
思路:根据题目易得,城市与公路将形成一颗树,所以本质上即求树上的两个结点的最远距离。
任选一个结点作为根节点,计算根节点到他各个叶节点的距离,经过这个根节点的最大距离一定为他到叶节点的第一大距离+第二大距离。
这里用dfs返回x结点到叶节点的最远距离,d1,d2分别表示最远距离和第二远距离,d1+d2就为两个叶子结点的距离,递归dfs保证计算了通过每一个结点,两个叶节点的最大距离,所以最终答案为d1+d2的最大值。
代码:
#include<iostream>
using namespace std;
const int N = 100005;
int n;
int cnt;
int ans;
int u,v,d;
int ne[N*2],to[N*2],w[N*2],head[N];
int dis[N];
void add(int u,int v,int d)
{
cnt++;
ne[cnt]=head[u];
to[cnt]=v;
w[cnt]=d;
head[u]=cnt;
}
int dfs(int x,int fa)
{
int d1=0,d2=0;
for(int i=head[x];i;i=ne[i])
{
int y=to[i];
if(y==fa) continue;
int d=dfs(y,x)+w[i];
if(d>d1) d2=d1,d1=d;
else if(d>d2) d2=d;
}
ans=max(ans,d1+d2);
return d1;
}
int main()
{
cin>>n;
for(int i=1;i<n;++i)
{
cin>>u>>v>>d;
add(u,v,d),add(v,u,d);
}
dfs(1,0);
cout<<ans*(ans+21)/2<<endl;
return 0;
}