大致题意:给出一个n个节点的无环连通图, 每条边都有权值,求最长的两个点之间的距离。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int M = 30010;
struct edge{
int to;
int val;
edge(){}
edge(int pp, int qq):to(pp), val(qq){}
};
vector<edge>ed[M];
int n;
long long ans[M];
long long dfs(int dep, int lim){
int i;
long long t[3] = {0};
//t[1],t[2]的值相当于这个节点两边的最大值
for(i = 0; i < ed[dep].size(); i++){
if(ed[dep][i].to == lim) continue;
t[0] = (long long)(dfs(ed[dep][i].to, dep) + ed[dep][i].val);
sort(t, t+3);
}
ans[dep] = max(ans[dep],t[1] + t[2]);
return t[2];
}
int main(){
int T, cas, i, j;
scanf("%d", &T);
for(cas = 1; cas <= T; cas++){
scanf("%d", &n);
for(i = 0; i < n; i++)
ans[i] = 0;
for(i = 0; i < n; i++)
if(!ed[i].empty())
ed[i].clear();
int a, b, c;
for(i = 1; i < n; i++){
scanf("%d%d%d",&a, &b, &c);
ed[a].push_back(edge(b, c));
ed[b].push_back(edge(a, c));
}
long long temp = dfs(0, 0);
long long mm = 0;
for(i = 0; i < n; i++)
if(ans[i] > mm)
mm = ans[i];
printf("Case %d: %lld\n", cas, mm);
}
return 0;
}