藍橋 - 大臣的旅費 樹的直徑板子題

思路:兩次dfs即可,第一次找到端點 第二次搜端點找到最大值即可

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
#define sd(a) scanf("%d",&a)
#define sdd(a,b) scanf("%d%d",&a,&b)
#define cl(a,b) memset(a,b,sizeof(a))
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define sddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define dbg() printf("aaa\n")
using namespace std;
const int maxn=1e5+10;
int n,cnt,f;
ll maxx;
struct node{
	int v,val,next;
}side[maxn<<1];
int head[maxn];
void add(int u,int v,int val){
	side[cnt].v=v;
	side[cnt].val=val;
	side[cnt].next=head[u];
	head[u]=cnt++;
}
void dfs(int u,int pre,int now){
	if(maxx<now){
		maxx=now;
		f=u;
	}
	for(int i=head[u];i!=-1;i=side[i].next){
		int v=side[i].v;
		int val=side[i].val;
		if(v==pre) continue;
		dfs(v,u,now+val);
	}
	return;
}
int main() {
	sd(n);
	rep(i,1,n) head[i]=-1;
	cnt=0;
	rep(i,1,n-1){
		int u,v,val;
		sddd(u,v,val);
		add(u,v,val);
		add(v,u,val);
	}
	maxx=0;
	dfs(1,-1,0);
	maxx=0;
	dfs(f,-1,0);
	printf("%lld\n",(1+maxx)*maxx/2+maxx*10);

	return 0;
}
/*
5
1 2 2
1 3 1
2 4 5
2 5 4
*/

題目描述
很久以前,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

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