题目地址:点击打开链接
思路:
就是要求一条最长路,可以从任意一点开始做一次最短路,找到最远的点,然后对这个最
远的点再做一次最短路,此时最远的路就是最长路。
代码:
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 1e4+5;
const int INF = 0x3f3f3f3f;
int n, dis[maxn];
bool book[maxn];
struct node
{
int v, w;
node() {}
node(int vv, int ww): v(vv), w(ww) {}
};
vector<node> g[maxn];
void spfa(int u)
{
memset(book, 0, sizeof(book));
for(int i = 1; i <= n; i++) dis[i] = INF;
dis[u] = 0;
queue<int> q;
q.push(u);
while(!q.empty())
{
u = q.front();
q.pop();
book[u] = 0;
for(int i = 0; i < g[u].size(); i++)
{
int v = g[u][i].v;
int w = g[u][i].w;
if(dis[u]+w < dis[v])
{
dis[v] = dis[u]+w;
if(!book[v])
{
book[v] = 1;
q.push(v);
}
}
}
}
}
int solve()
{
spfa(1);
int tmp = 0, tmpIndex;
for(int i = 1; i <= n; i++)
if(dis[i] > tmp)
tmp = dis[i], tmpIndex = i;
spfa(tmpIndex);
int ans = 0;
for(int i = 1; i <= n; i++)
if(dis[i] > ans)
ans = dis[i];
return ans*10+(1+ans)*ans/2;
}
int main(void)
{
while(cin >> n)
{
for(int i = 0; i < maxn; i++) g[i].clear();
for(int i = 1; i < n; i++)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
g[u].push_back(node(v, w));
g[v].push_back(node(u, w));
}
printf("%d\n", solve());
}
return 0;
}