#include<bits/stdc++.h>//本文求树的直径,目前还未学习树的dp,所以用两遍dfs'
using namespace std;
//先从任意一点P出发,找离它最远的点Q,再从点Q出发,
//找离它最远的点W,W到Q的距离就是是的直径
const int N=1e6+10; //因为为无向图,所以N大些,1e5+10的二倍也可以。
int dist[N]; //距离数组,表示每点到首都的距离
int idx,e[N],ne[N],h[N],w[N];//用邻接表存储图
int n;
typedef long long LL;
bool st[N]; //bool数组表示状态,表示是否已经标记过该点
void add(int a,int b,int c)
{
e[idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx++;
}
void dfs(int u,int dif)
{
dist[u]=dif; //更新dist数组
st[u]=1; //更新st数组
for(int i=h[u];i!=-1;i=ne[i]) //经典图论遍历
{
int j=e[i];
if(!st[j]) //如果该点还未更新
{
dfs(j,dif+w[i]); //进行dfs
}
}
}
int main()
{
memset(h,-1,sizeof h); //图论问题用到邻接表,不要忘了初始化h数组
cin>>n;
for(int i=0;i<n-1;i++)//初始化图操作
{
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
add(b,a,c); //因为为无向图;
}
dfs(1,0) ;//1表示从首都开始dfs,0表示初始化距离为0;dist[1]=0;
int maxdist=0,maxidx=0;//定义两个变量,分别表示dist[]max,以及此时idx
for(int i=1;i<=n;i++)
{
if(dist[i]>maxdist)
{
maxdist=dist[i];
maxidx=i;
}
}
memset(dist,0,sizeof dist);
memset(st,false,sizeof st);
dfs(maxidx,0);
maxdist=0;
for(int i=1;i<=n;i++)
{
if(dist[i]>maxdist)
{
maxdist=dist[i];
}
}
cout<<(LL)maxdist*10+(LL)maxdist*(maxdist+1)/2<<endl; //题意求出最长路
return 0;
}
06-08
04-05
116
04-28
12-04
04-24
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交