#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <string>
using namespace std;
const int NI = 100005;
const int INF = 0x3f3f3f3f;
struct node {
int num, dis;
node(int n, int d) {
num = n; dis = d;
}
bool operator < (const node &a) const{
if(dis == a.dis) return num < a.num;
return dis < a.dis;
}
};
vector<node> g[NI];
int dis[NI];
int n, a, b, c;
void dijkstra(int s) {
memset(dis, INF, sizeof(dis));
dis[s] = 0;
priority_queue<node> q;
q.push(node(s, dis[s]));
while(!q.empty()) {
node x = q.top(); q.pop();
for(int i = 0; i < (int)g[x.num].size(); i++) {
node y = g[x.num][i];
if(x.dis + y.dis < dis[y.num]) {
dis[y.num] = x.dis + y.dis;
q.push(node(y.num, dis[y.num]));
}
}
}
}
int main() {
scanf("%d", &n);
for(int i = 0; i < n-1; i++) {
scanf("%d%d%d", &a, &b, &c);
g[a].push_back(node(b, c));
g[b].push_back(node(a, c));
}
dijkstra(1);
int maxn = -1, maxx = -1;
for(int i = 1; i <= n; i++) {
if(dis[i] > maxn) {
maxn = dis[i]; maxx = i;
}
}
dijkstra(maxx);
maxn = -1, maxx = -1;
for(int i = 1; i <= n; i++) {
if(dis[i] > maxn) {
maxn = dis[i]; maxx = i;
}
}
long long res = 0;
for(int i = 0; i < dis[maxx]; i++) {
res += i + 11;
}
printf("%I64d\n", res);
return 0;
}
优先队列优化的迪杰斯特拉算法
最新推荐文章于 2022-04-15 23:08:15 发布