题目链接
题意:求一个树中两点之间的最大距离。
思路:等于求树的直径。
先从根开始找离根最远的那个点,树的直径一定是从这个点出发到另一个点的距离。
然后再从这个点找离这个点最远的点,这两个点的距离就是树的直径。
只需要两次深搜遍历。
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
vector<pair<ll,ll> > v[maxn];
ll visit[maxn];
ll res,dv;
void dfs(ll n,ll sum)
{
if(visit[n])
return;
visit[n]=1;
for(int i=0;i<v[n].size();i++)
{
ll a=v[n][i].first;
ll b=v[n][i].second;
if(visit[a])
continue;
if(sum+b>res)
{
res=sum+b;
dv=a;
}
dfs(a,sum+b);
}
}
int main()
{
ll n;
cin>>n;
for(int i=0;i<n-1;i++)
{
ll p,q,d;
cin>>p>>q>>d;
v[p].push_back(make_pair(q,d));
v[q].push_back(make_pair(p,d));
}
memset(visit,0,sizeof(visit));
res=0;
dfs(1,0);
memset(visit,0,sizeof(visit));
res=0;
dfs(dv,0);
cout<<res*10+res*(res+1)/2<<endl;
return 0;
}