因为题目给出:从首都到达每个大城市的方案都是唯一的。
即 这是一个无环图–> 树
要找到从一个点到另一个点的最大值,就是找出树的直径。
有多种求法:
本题解只写两种:
1.bfs/dfs
2.树形dp
算法1
(dfs)
第一步,随机一个点,找出距离它的最远路径,
第二步,根据找出这个最远点,再找出它的最远路径。
此时这个最远路径就是树的直径。
之后根据等差数组求和公式算出需要多少钱即可。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int h[N],e[N],ne[N],w[N],idx;
int dis[N];
int n;
void add(int a, int b ,int c)
{
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}
// 因为是双向联通 所以在遍历结点的时候要判断一下
void dfs(int u, int fa, int dist)
{
dis[u] = dist;
for(int i = h[u]; ~i; i = ne[i])
{
int j = e[i];
if(j != fa)
dfs(j,u,dist + w[i]);
}
}
int main()
{
cin >> n;
memset(h,-1,sizeof h);
for(int i = 1; i < n; i ++)
{
int a, b, c;
cin >> a >> b >> c;
add(a,b,c);
add(b,a,c);
}
dfs(1,-1,0);
int u = 1;
for(int i = 2; i <= n; i ++) if(dis[u] < dis[i]) u = i;
dfs(u,-1,0);
for(int i = 1; i <= n; i ++) if(dis[u] < dis[i]) u = i;
int dist = dis[u];
cout<<(dist) * (long long)(dist + 10 + 11) / 2<<endl;
return 0;
}
算法2
(树形DP)
再说
C++ 代码