题目分析
这道题我最初用floyd写的,但是只得了75分,今天没事有重新看了一下,然后我就深搜了,首先从根节点,也就是首都出发找到最远距离的那个点,然后再从最远距离的那个点出发dfs一遍找到最远距离输出即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
const int maxn = 1e5+100;
int head[maxn], dp1[maxn], dp2[maxn], tot;
struct Edge{
int to, val, next;
}e[maxn];
void addedge(int from, int to, int val){
e[tot].to = to;
e[tot].val = val;
e[tot].next = head[from];
head[from] = tot++;
}
void dfs1(int u, int fa, int val){
dp1[u] = val;
for(int i = head[u]; i != -1; i = e[i].next){
int v = e[i].to;
if(v == fa) continue;
dfs1(v, u, val+e[i].val);
}
}
void dfs2(int u, int fa, int val){
dp2[u] = val;
for(int i = head[u]; i != -1; i = e[i].next){
int v = e[i].to;
if(v == fa) continue;
dfs2(v, u, val+e[i].val);
}
}
void init(){
memset(dp1, 0, sizeof(dp1));
memset(dp2, 0, sizeof(dp2));
memset(head, -1, sizeof(head));
tot = 0;
}
int main(){
int n;
while(scanf("%d", &n) != EOF){
init();
int from, to, val;
for(int i = 1; i < n; i++){
scanf("%d%d%d", &from, &to, &val);
addedge(from, to, val);
addedge(to, from, val);
}
dfs1(1, -1, 0);
int start, temp = 0;
for(int i = 1; i <= n; i++){
if(dp1[i] > temp){
start = i;
temp = dp1[i];
}
}
dfs2(start, -1, 0);
int ans = 0;
for(int i = 1; i <= n; i++)
if(dp2[i] > ans) ans = dp2[i];
printf("%I64d\n", (LL)10*ans + (LL)(ans+1)*ans/2);
}
return 0;
}