蓝桥杯 历届试题 大臣的旅费
历届试题 大臣的旅费
时间限制:1.0s 内存限制:256.0MB
问题描述
很久以前,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 2 2
1 3 1
2 4 5
2 5 4
样例输出1
135
输出格式
大臣J从城市4到城市5要花费135的路费。
解法一:
树的直径问题:两个BFS(用反证法可证明)
1 #include <iostream> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cstring> 6 #include <vector> 7 #include <queue> 8 using namespace std; 9 struct Edge{ 10 int to,next,val; 11 }; 12 long long max_len; 13 int max_num,n; 14 void bfs(int s,long long *dis,Edge *e,int *h){ 15 //memset(dis,-1,sizeof(dis)); 16 int top,i; 17 for(i=1;i<=n;i++){ 18 dis[i]=-1; 19 } 20 queue<int> q; 21 q.push(s); 22 //vis[s]=true; 23 dis[s]=0; 24 25 while(!q.empty()){ 26 27 //cout<<max_num<<endl; 28 29 top=q.front(); 30 q.pop(); 31 //vis[top]=false; 32 for(i=h[top];i+1;i=e[i].next){ 33 //cout<<i<<endl; 34 if(dis[e[i].to]==-1){ 35 //vis[e[i].to]=true; 36 dis[e[i].to]=dis[top]+e[i].val; 37 if(dis[e[i].to]>max_len){ 38 max_len=dis[e[i].to]; 39 max_num=e[i].to; 40 } 41 q.push(e[i].to); 42 } 43 } 44 } 45 } 46 int main(){//树的直径问题 47 //freopen("D://INPUT.txt","r",stdin); 48 scanf("%d",&n); 49 Edge *e=new Edge[n*2+1]; 50 int *h=new int[n+1]; 51 long long *dis=new long long[n+1]; 52 //bool *vis=new vis[n+1]; 53 int i,num=0; 54 int nn=n-1,u,v,val; 55 //memset(h,-1,sizeof(h)); 56 for(i=1;i<=n;i++){ 57 h[i]=-1; 58 } 59 60 61 for(i=0;i<nn;i++){//建邻接表 62 scanf("%d %d %d",&u,&v,&val); 63 e[num].to=v; 64 e[num].val=val; 65 e[num].next=h[u]; 66 h[u]=num++; 67 68 e[num].to=u; 69 e[num].val=val; 70 e[num].next=h[v]; 71 h[v]=num++; 72 } 73 max_len=-1; 74 max_num=1; 75 bfs(1,dis,e,h); 76 77 //cout<<max_num<<endl; 78 //cout<<max_len<<endl; 79 80 bfs(max_num,dis,e,h); 81 cout<<max_len*(max_len+21)/2<<endl; 82 delete []e; 83 delete []h; 84 delete []dis; 85 return 0; 86 }