# 大臣的旅费
**问题描述**
很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。
为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。
J是T国重要大臣,他巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到另一个城市成了J最常做的事情。他有一个钱袋,用于存放往来城市间的路费。
聪明的J发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关,在走第x千米到第x+1千米这一千米中(x是整数),他花费的路费是x+10这么多。也就是说走1千米花费11,走2千米要花费23。
J大臣想知道:他从某一个城市出发,中间不休息,到达另一个城市,所有可能花费的路费中最多是多少呢?
**输入格式**
输入的第一行包含一个整数n,表示包括首都在内的T王国的城市数
城市从1开始依次编号,1号城市为首都。
接下来n-1行,描述T国的高速路(T国的高速路一定是n-1条)
每行三个整数Pi, Qi, Di,表示城市Pi和城市Qi之间有一条高速路,长度为Di千米。
**输出格式**
输出一个整数,表示大臣J最多花费的路费是多少。
**样例输入1**
```
5
1 2 2
1 3 1
2 4 5
2 5 4
```
**样例输出1**
```
135
```
**输出格式**
```
大臣J从城市4到城市5要花费135的路费。
```
下面错误的一项是?
## aop
### before
```c
#include
using namespace std;
```
### after
```c
```
## 答案
```c
struct edge
{
int to, cost;
};
vector> G;
vector vst;
int n;
int ans, dis;
void dfs(int u, int d)
{
vst[u] = true;
if (d > dis)
ans = u, dis = d;
for (int i = 0; i < G[u].size(); i++)
{
int son = G[u][i].to;
if (!vst[son])
dfs(son, G[u][i].cost);
}
vst[u] = false;
}
int find(int u)
{
ans = dis = 0;
dfs(u, 0);
return ans;
}
int main()
{
scanf("%d", &n);
G.resize(n + 5), vst.resize(n + 5);
for (int i = 1; i < n; i++)
{
int p, q, d;
scanf("%d %d %d", &p, &q, &d);
G[p].push_back(edge{q, d});
G[q].push_back(edge{p, d});
}
int x = find(1), y = find(x);
printf("%d", dis * (dis + 1) / 2 + 10 * dis);
return 0;
}
```
## 选项
### A
```c
const int maxd = 10000 + 50;
struct Point
{
map m;
int status;
} p[maxd];
int r = 0, gps;
void f(int x, int ctn)
{
p[x].status = 1;
for (map::iterator it = p[x].m.begin(); it != p[x].m.end(); it++)
{
if (p[it->first].status == 1)
continue;
f(it->first, ctn + it->second);
}
p[x].status = 0;
if (r < ctn)
{
r = ctn;
gps = x;
}
}
int main()
{
int n, i, x, y, l;
cin >> n;
for (i = 0; i < n - 1; i++)
{
cin >> x >> y >> l;
p[x].m[y] = l;
p[y].m[x] = l;
}
f(1, 0);
f(gps, 0);
cout << (21 + r) * r / 2;
return 0;
}
```
### B
```c
#define _for(i, a, b) for (int i = a; i < b; i++)
#define _unfor(i, a, b) for (int i = a; i >= b; i--)
#define RI(a) scanf("%d", &a)
using namespace std;
typedef long long LL;
int d[111111], n, vis[111111], maxh = 0, p_h[111111], ans = 0;
vector son[111111], G[111111], h_p[111111];
map, int> W;
int main()
{
RI(n);
_for(i, 1, n)
{
int a, b, c;
RI(a);
RI(b);
RI(c);
G[a].push_back(b);
G[b].push_back(a);
pair pr(a > b ? a : b, a > b ? b : a);
W[pr] = c;
}
queue q;
q.push(1);
h_p[0].push_back(1);
while (!q.empty())
{
int v = q.front(), len = G[v].size();
q.pop();
vis[v] = 1;
_for(k, 0, len)
{
int e = G[v][k];
if (!vis[e])
{
vis[e] = 1;
son[v].push_back(e);
q.push(e);
maxh = max(maxh, p_h[e] = p_h[v] + 1);
h_p[p_h[e]].push_back(e);
}
}
}
_unfor(h, maxh, 0)
{
int len = h_p[h].size();
_for(k, 0, len)
{
int i = h_p[h][k], _max = 0, _cmax = 0;
int len2 = son[i].size();
_for(k2, 0, len2)
{
int j = son[i][k2], t;
pair pr(i > j ? i : j, i > j ? j : i);
t = W[pr] + d[j];
if (t > _cmax)
if ((_cmax = t) > _max)
swap(_max, _cmax);
ans = max(ans, _max + _cmax);
}
d[i] = _max;
}
}
cout << (LL)(ans + 1) * ans / 2 + ans * 10 << endl;
}
```
### C
```c
#define mem(a, b) memset(a, b, sizeof(a))
#define ll long long
const double eps = 3e-8;
const int mod = 10;
const int maxn = 10005;
vector ed[maxn];
ll edge[maxn][maxn];
ll dis[maxn];
ll sum = 0;
int bfs(int node)
{
mem(dis, -1);
queue que;
que.push(node);
int ans = node;
dis[node] = 0;
while (!que.empty())
{
int now = que.front();
que.pop();
for (int i = 0; i < ed[now].size(); i++)
{
int temp = ed[now][i];
if (dis[temp] < 0)
{
dis[temp] = dis[now] + edge[now][temp];
if (dis[temp] > sum)
{
ans = temp;
sum = dis[temp];
}
que.push(temp);
}
}
}
return ans;
}
int main()
{
int n, a, b;
ll c;
scanf("%d", &n);
for (int i = 1; i < n; i++)
{
scanf("%d%d%lld", &a, &b, &c);
ed[a].push_back(b);
ed[b].push_back(a);
edge[a][b] = c;
edge[b][a] = c;
}
int starta = 1;
int endnode, startnode;
sum = 0;
endnode = bfs(starta);
sum = 0;
startnode = bfs(endnode);
double ans = sum * (sum + 1.0) / 2 + 10.0 * sum;
printf("%.0f\n", ans);
}
```