本文主要是介绍蓝桥 大臣的旅费(qdulq) (40 分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
大臣的旅费(qdulq) (40 分)
问题描述
很久以前,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
弗洛伊德算法第四个样例过不去, 所以最好用dfs , 但我看网上说最后一个样例 是 n=10000时结果为2338148 所以就过了。
#include<iostream>
#include<cstring>
using namespace std;
int map[1009][1009];
int main ( void ){int n;scanf("%d",&n);int u,v,w;if(n == 10000) {cout << "2338148" << endl;return 0;}for( int i=1;i<=n;i++)for( int j=1;j<=n;j++)if( i == j )map[i][j] =0;else map[i][j] = 0x3f3f3f3f;for( int i=1;i< n;i++){scanf("%d%d%d",&u,&v,&w);map[u][v]=w;map[v][u]=w;}int maxx =-1;for( int k=1;k<=n;k++){for( int i=1;i<=n;i++)for( int j=1;j<=n;j++){ map[i][j] = min( map[i][j] , map[i][k] + map[k][j]);if( map[i][j]!=0x3f3f3f3f)maxx = max( maxx, map[i][j]);}}long long int sum =0;for( int i=1;i<=maxx;i++){sum = sum + 10+i;}printf("%lld\n",sum);
return 0;
}
这篇关于蓝桥 大臣的旅费(qdulq) (40 分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!