标题:大臣的旅费
很久以前,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最多花费的路费是多少。
样例输入:
5
1
2 2
1 3 1
2 4 5
2 5
4
样例输出:
135
样例说明:
大臣J从城市4到城市5要花费135的路费。
首先需要建一个图,初始化图的时候,两个相同点的距离是0,不同点的距离是无穷。再根据输入边的距离来改变两点间的距离。
这道题主要是找到最长的两个点的最短距离,然后计算花费即可。
1 #include<stdio.h> 2 #define MAXN 100000 3 #define N 50 4 int dist[N][N]; 5 6 int main() 7 { 8 int num1,num2,maxn,i,j,k; 9 int n,m,longjl = 0,p = 0,q = 0; 10 scanf("%d",&n); 11 for(i = 1;i <= n;i++)//初始化图 12 { 13 for(j = 1;j <= n;j++) 14 { 15 if(i != j) 16 { 17 dist[i][j] = MAXN; 18 } 19 else 20 { 21 dist[i][j] = 0; 22 } 23 } 24 } 25 for(i = 1;i < n;i++)//按输入的边改变图,有n-1条边的连通图相当于树 26 { 27 scanf("%d%d%d",&num1,&num2,&m); 28 dist[num1][num2] = m; 29 dist[num2][num1] = m; 30 } 31 for(i = 1;i <= n;i++) 32 { 33 for(j = 1;j <= n;j++) 34 { 35 for(k = 1;k <= n;k++) 36 { 37 dist[i][j] = dist[i][j] < dist[i][k]+dist[k][j]?dist[i][j]:(dist[i][k]+dist[k][j]);//Floyd算法,找到任意两点之间的最短距离 38 } 39 } 40 } 41 for(i = 1;i <= n;i++) 42 { 43 for(j = 1;j <= n;j++) 44 { 45 if(dist[i][j] < MAXN&&dist[i][j] > longjl) 46 { 47 longjl = dist[i][j]; //找距离的最大值 48 p = i; 49 q = j; 50 } 51 } 52 } 53 printf("大臣j从%d城市到%d城市最多花费",p,q); 54 int sum = 0; 55 for(i = 1;i <= longjl;i++) 56 { 57 sum = sum + i + 10; //计算花费 58 } 59 printf("%d\n",sum); 60 return 0; 61 }
原文:http://www.cnblogs.com/flying123/p/3601771.html