题意:
求一棵树中最长路径的长度及其数量
分析:
树的最长路径无非是树的直径,记录每个节点的子树中经过该节点的最长路径及其数量,更新树的直径时,同时更新直径的数量
代码:
#include <bits/stdc++.h>
const int MAXN = 1e5+55;
using namespace std;
struct edge{
int v,w,next;
}e[MAXN<<1];
int n,w,v,u,cnt,ans,res,head[MAXN],len[MAXN],num[MAXN];
void add(int u,int v,int w)
{
e[cnt].v = v;
e[cnt].w = w;
e[cnt].next = head[u];
head[u] = cnt++;
}
void dfs(int x,int pre)
{
num[x] = 1;
for(int i = head[x]; i ; i = e[i].next)
{
int v = e[i].v;
if(v == pre) continue;
dfs(v,x);
int tep = len[v] + e[i].w;
if(len[x] + tep > ans){
ans = len[x] + tep;
res = num[x] * num[v];
}
else if(len[x] + tep == ans) res += num[x] * num[v];
if(tep > len[x]){
len[x] = tep;
num[x] = num[v];
}
else if(tep == len[x]) num[x] += num[v];
}
}
int main()
{
while(cin>>n){
cnt = 1;
ans = 0;
memset(len,0,sizeof(len));
memset(head,0,sizeof(head));
for(int i = 1; i < n; ++i)
{
scanf("%d %d %d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
dfs(1,0);
printf("%d %d\n",ans,res);
}
return 0;
}