試題 歷屆試題 大臣的旅費(圖中最長距離)

問題描述
很久以前,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的路費。

設(s,t)是距離最遠的兩個點。首先從任意一點出發,這個點能到達的最遠距離的那個點tot,則tot就是s或者t。然後從tot出發即可。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=10005;
const int inf=0x3f3f3f3f;
int v[N],head[N],n,tot,ans,m,num;
struct node{
	int to,next,w;
}s[N*10];
void add(int u,int v,int w){
	s[++num]=(node){v,head[u],w	};
	head[u]=num;
}
void dfs(int x,int sum){
	if(sum>ans){
		ans=sum;
		tot=x;
	}	
	v[x]=1;
	for(int i=head[x];i;i=s[i].next){
		int to=s[i].to;
		if(!v[to]){
			dfs(to,sum+s[i].w);
		}
	}
	v[x]=0;
}
int main()
{
	int i,j,k,x,y,v;
	scanf("%d",&n);
	for(i=1;i<n;i++){
		scanf("%d %d %d",&x,&y,&v);
		add(x,y,v);add(y,x,v);
	}
	dfs(1,0);
	dfs(tot,0);
					
	printf("%d",10*ans+ans*(ans+1)/2);
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章