这道题没说数据量,最后一组数据总是过不了,数据量太大了,要用邻接表节省内存。
一棵树,随便一个点深度dfs,最长的路径肯定经过树根,树根到终点肯定是最远两个点的一段,所以在再终点做dfs。
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<string.h>
#include<ctype.h>
#include<set>
#include<math.h>
using namespace std;
#define MAXN 10017
#define MAXE 100017
struct Edge
{
int v, w,next;
Edge(){ }
Edge(int _v, int _w, int _next) :v(_v), w(_w), next(_next)
{
}
};
Edge edges[MAXE];
int tol;
int head[MAXN];
int n;
void addEdge(int u,int v,int w)
{
edges[tol] = Edge(v, w,head[u]);
head[u] = tol++;
edges[tol] = Edge(u, w,head[v]);
head[v] = tol++;
}
int len;
int maxLen;
int endPoint;
bool visited[MAXN];
void dfs(int u, int tempLen)
{
if (visited[u])
return;
visited[u] = true;
len += tempLen;
if(len>maxLen)
{
endPoint = u;
maxLen = len;
}
for(int i=head[u];i!=-1;i=edges[i].next)
{
dfs(edges[i].v, edges[i].w);
}
visited[u] = false;
len -= tempLen;
}
long long cost(int len)
{
long long ans = 0;
for (int i = 1; i <= len; i++)
{
ans += i + 10;
}
return ans;
}
int main()
{
tol = 0;
memset(head, -1, sizeof(head));
memset(visited, 0, sizeof(visited));
scanf("%d", &n);
for(int i=0;i<n-1;i++)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
addEdge(u, v, w);
}
len = 0;
maxLen = 0;
dfs(1, 0);
dfs(endPoint, 0);
printf("%lld\n", cost(maxLen));
}