藍橋杯 歷屆試題 大臣的旅費 求樹的直徑

2021-10-25 18:10:58 字數 2756 閱讀 4634

試題 歷屆試題 大臣的旅費

提交此題

資源限制

時間限制: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...