原本用点分治做的,后来貌似姿势错了一直tle,重心优化也做了
后来才发现原来treedp直接是O(n)的,也难怪点分治会tle
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <queue>
#include <map>
using namespace std;
#define INF 1e9
#define maxn 100010
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define mset(x) memset(x,0,sizeof(x))
int n, w, v, len, ans;
__int64 num;
struct edgenode{
int v, len;
edgenode(){}
edgenode(int v, int len): v(v), len(len){}
};
vector<edgenode> G[maxn];
int maxv[maxn], cnt[maxn];
void dfs(int u, int pa){
cnt[u] = 1;
//maxv[u] 表示从u到其子树上某点的最长路径,cnt[v]表示最长路径的条数
for(int i=0; i<G[u].size(); i++)
{
int v = G[u][i].v;
if(v == pa) continue;
dfs(v, u);
int tmp = maxv[v] + G[u][i].len;
//更新ans
if(ans < maxv[u] + tmp){
ans = maxv[u] + tmp;
num = (__int64)cnt[v]*cnt[u];
}
else if(ans == maxv[u] + tmp) num += (__int64)cnt[u]*cnt[v];
//更新maxv[u]
if(tmp > maxv[u]){
maxv[u] = tmp;
cnt[u] = cnt[v];
}
else if(tmp==maxv[u]) cnt[u] += cnt[v];
}
}
void init(){
rep(i, 1, n) G[i].clear();
mset(maxv), mset(cnt);
ans = 0, num = 0;
}
int main(){
/// freopen("a.txt","r",stdin);
// freopen(".out","w",stdout);
while(cin>>n){
init();
rep(i,1,n-1){
scanf("%d%d%d", &w, &v, &len);
G[w].push_back(edgenode(v, len));
G[v].push_back(edgenode(w, len));
}
dfs(1, -1);
printf("%d %I64d\n", ans, num);
}
return 0;
}