题目描述
很久以前,某王国拥有 n 个大城市,为了方便交通,国王下令修建了大量的用于连接首都和其他各大城市高速路。
为节省经费,王国采用了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。并且,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。
G商队是王国重要的运输商队,他们奔波于各大城市之间,为王国的人们运输商品,实现长途贸易。所以,从一个城市马不停蹄地到另一个城市成了G商队最常做的事情。他们有一个钱袋,用于存放往来城市间的运输费。
在运输过程中G商队发现,如果不在某个城市停下来休整,在连续行进过程中,他们所花的运输费与他们已走过的距离有关,在走第x千米到第x+1千米这一千米中(x是整数),他们花费的运输费是x+10这么多。也就是说走1千米花费11,走2千米要花费23。
G商队想知道:他们从某一个城市出发,如果中间不休息,到达另一个城市,所有可能花费的运输费中最多是多少呢?
输入
输入的第一行包含一个整数n,表示包括首都在内的王国的城市数 城市从1开始依次编号,1号城市为首都。 接下来n-1行,描述王国的高速路(王国的高速路一定是n-1条) 每行三个整数Pi, Qi, Di,表示城市Pi和城市Qi之间有一条高速路,长度为Di千米。输入城市数(〈10),长度(〈=100)
| 样例输入5 1 2 2 1 3 1 2 4 5 2 5 4
|
输出
输出一个整数,表示G商队最多花费的运输费是多少。
| 样例输出
135
|
时间限制C/C++语言:1000MS其它语言:3000MS | 内存限制C/C++语言:65536KB其它语言:589824KB |
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
//freopen("in.txt","r",stdin);
while(cin>>n)
{
vector<vector<int>>m(n);
for(int i=0; i<n; ++i)
for(int j=0; j<n; ++j)
m[i].push_back(9999999);
for(int i=0; i<n; ++i)
m[i][i] = 0;
int a,b,c;
for(int i=0; i<n; ++i)
{
cin >> a>>b >> c;
m[b-1][a-1] = m[a-1][b-1] = c;
}
//......
for(int k=0; k<n; ++k)
{
for(int i=0; i<n; ++i)
{
for(int j=0; j<n; ++j)
{
if(m[i][k] + m[k][j] < m[i][j])
m[i][j] = m[i][k] + m[k][j];
}
}
}
int res = -1;
for(int i=0; i<n; ++i)
for(int j=0; j<n; ++j)
res = max(res,m[i][j]);
cout << 10 * res + (1+res)*res/2 <<endl;
}
//fclose(stdin);
return 0;
}