这个题,因为没有告诉你n的范围,就想从每个点开始搜它的最远距离,然后果断超时。然后看到别人说这个是求树的直径,也就是求最大的两个点的距离。然后只用两个dfs或者两个bfs就行了
证明:如果我从任意一个点u开始,找到一个最远的距离v。此时这个u-v与直径有一个交点,则这个交点到v,则v肯定在直径上。(感觉这个说的不是很清楚,还需要自己多体会体会~)
<我写 的有点丑。。又懒得改。。>
#include <iostream>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
struct edge
{
int to,w;
};
vector <edge > v[100000];
int ans=0,point=0;
int vis[100000];
int dfs(int k,int sum)
{
for(int i=0;i<v[k].size();i++)
{
edge e=v[k][i];
if(vis[e.to]==-1)
{
sum=sum+e.w;
if(ans<sum)
{ ans=sum;point=e.to;}
vis[e.to]=sum;
dfs(e.to,sum);
sum=sum-e.w;
vis[e.to]=-1;
}
}
}
int main(int argc, char *argv[])
{
int n;
scanf("%d",&n);
for(int i=0;i<n-1;i++)
{
int a,b,w;
scanf("%d %d %d",&a,&b,&w);
v[a].push_back((edge){b,w});
v[b].push_back((edge){a,w});
}
memset(vis,-1,sizeof(vis));//不要太在乎这里的的vis,这里只是用来标记的。
vis[1]=0;
dfs(1,0);
memset(vis,-1,sizeof(vis));
vis[point]=0;
dfs(point,0);
// cout<<ans<<endl;
//cout<<ans<<endl;
int kk=10*ans+(1+ans)*ans/2;
printf("%d\n",kk);
return 0;
}