試題 歷屆試題 大臣的旅費
提交此題
資源限制
時間限制: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
51 2 2
1 3 1
2 4 5
2 5 4
樣例輸出1
135輸出格式
大臣j從城市4到城市5要花費135的路費。
ps:n<1e4+5
首先想到的是暴力,問題是題目也沒給n的範圍所以就不假思索的暴力搜尋了。開個1000的二維vector提交後最後一組測試顯示執行錯誤,其他測試用例都對,就是陣列太小了,改為1e4就提交就超時了。
先上錯誤**:
搜尋任意兩點的距離那時間就太長了,應該是o(n*m);m是邊數
#include
#include
#include
#include
#include
using
namespace std;
#define ll long long int
int n;
vector<
int> e[
10005];
vector<
int> w[
10005];
int book[
10005];
ll ans=
0ll;
void
dfs(
int x,ll sum)
}return;}
intmain
(void
)for
(int i=
1;i<=n;i++
)///
//cout("%lld"
,(ans*(21
+ans))/
2);return0;
}
正確的做法:
我們要求的是該無向圖兩個點之間的路徑最長是多少,求出最長的路程。題目也說了根節點到任意節點的路經是唯一的,說明這個無向圖就是一顆樹,樹上求兩個節點的最長路程就是求這顆樹的直徑。現在問題就轉為求一顆樹的直徑。
那麼怎麼求一顆樹的直徑?
思路就是:從樹的任意乙個節點出發,求出距離該節點最遠的點u,再求出距離u最遠的節點v。u,v的距離就是這顆樹的直徑。
說白了就是兩次dfs:
ac**如下:
#include
#include
#include
#include
#include
using
namespace std;
#define ll long long int
int n;
vector<
int> e[
10005];
vector<
int> w[
10005];
int book[
10005];
ll ans=
0ll;
int pu;
void
dfs(
int x/*當前節點*/
,int d/*距離*/
)for
(int i=
0;i.size()
;i++)}
return;}
intmain
(void
)//第一次dfs找出距離1最遠的點pu
book[1]
=1;dfs(1
,0);
ans=
0ll;
fill
(book,book+n+1,
0); book[pu]=1
;//別忘了標記
//第二次dfs找出距離pu最遠的點pv
dfs(pu,0)
;//cout("%lld"
,(ans*(21
+ans))/
2);return0;
}
求出直徑,然後求路費就是把路程分成n個距離為1的線段求總花費,也就是乙個首項為11,尾項為n+10且公差為1的等差數列求和。 藍橋杯 歷屆試題 大臣的旅費 求樹的直徑
問題描述 很久以前,t王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連線首都和王國內的各大城市。為節省經費,t國的大臣們經過思考,制定了一套優秀的修建方案,使得任何乙個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重複經過大城市,從首都到達每個大城市的方案都是唯一的。j...
藍橋杯 歷屆試題 大臣的旅費
很久以前,t王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連線首都和王國內的各大城市。為節省經費,t國的大臣們經過思考,制定了一套優秀的修建方案,使得任何乙個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重複經過大城市,從首都到達每個大城市的方案都是唯一的。j是t國重要...
歷屆試題 大臣的旅費 藍橋杯
問題描述 很久以前,t王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連線首都和王國內的各大城市。為節省經費,t國的大臣們經過思考,制定了一套優秀的修建方案,使得任何乙個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重複經過大城市,從首都到達每個大城市的方案都是唯一的。j...