大臣的旅費

2022-08-12 13:15:09 字數 3765 閱讀 3404

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

一共有 n 個點,共 n - 1 條路線,且任意兩點之間有路線,無環,因此這是乙個樹,也是乙個無環無向圖。

因此就可以使用dfs或bfs進行搜尋,或用floyd演算法求多源點之間的最短路(將邊的權改為負)。

但是floyd演算法的時間複雜度很高 o(n^3),只能通過75%的資料,事實上,大約超過 300 個點之後都會執行超時,只是它的測試資料較弱罷了

首先是floyd演算法:

1/*2

* 多源點之間的最短距離

3* 還忽略乙個問題, 那就是鄰接矩陣的大小 4*/

5 #include6 #include7 #include8

9using

namespace

std;

1011

const

int max_v = 1009;12

const

int inf =1e6;

1314

inte[max_v][max_v];

15int n = 0;16

17void print(int

a[max_v][max_v])

1823 cout<

;24} 25}

2627

intmain()

2835

else38}

39while(cin>>n)

4047

//print(e);

48//

floyd

49//

居然沒有 0 ......

50for(int k=1;k<=n;k++)

51for(int i=1;i<=n;i++)

52for(int j=1;j<=n;j++)

53//

非得逼我手算一次才能發現問題所在...(abs)

54if(abs(e[i][j]) > abs(e[i][k] +e[k][j]))

60//

print(e);

61 ret = -ret;

62int ans = (11 + (ret+10))*(ret)/2

;63 cout

64break;65

}6667return0;

68 }

view code

接下來是深搜:

1/*2

* 比較典型的圖或樹的搜尋

3* 這個圖比較稀疏, 鄰接表可能會好一點

4* 我們只要搜尋度為 1 的點就好, 它一定是起點或者終點

5* 因為如果度大於 1 的點是終點的話,一定可以繼續走下去

6- 後記 - :我沒想到怎樣避免不搜尋圖中遇到它...

7- 現在有想法了, 如果它是起點,那麼 dis = 0

8* 那麼它一定還可以繼續前進

9* -----------------------------------

10* 此外, 還可以用floyd演算法來求多源點之間的最短距離

11* 這裡的距離是求最長距離,所以賦予其負的權值就 ok

12*/

13 #include14 #include15 #include16 #include17

18using

namespace

std;

1920

const

int max_v = 10009; //

題目沒有說最大城市的數量

21int ret = -1; //

最大花費

22int dis = 0; //

當前走的距離

23bool

book[max_v];

24int s = 0;25

int km = 0;26

int loc = 0;27

28struct

edge;

3233 vectorg[max_v];

3435

//搜尋起點,從 1 開始找最遠的距離

36void finds(int a, int

km)3744}

45for(int i=0;i)51}

52}5354

//費用最大,即走的路程最多

55void dfs(int a, int

dis)56

61for(int i=0;i)67}

6869

return;70

}7172int

main()

7387 memset(book, true, sizeof

(book));

88 book[1] = false

;89 finds(1, 0

);90

//cout<

//cout<

(book));

93 book[loc] = false

;94 dfs(loc, 0

);95

//cout<

9899

return0;

100}

101/*

好像是錯誤的,通過的資料應該是巧合

102edge mx;

103mx.len = 0;

104int s = 0;

105for(int i=1;i<=n;i++)

111}

112}

113*/

view code

深搜分兩次,第一次找起點,第二次找最長路徑。就像提示裡說的那樣......

大臣的旅費

問題描述 很久以前,t王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連線首都和王國內的各大城市。為節省經費,t國的大臣們經過思考,制定了一套優秀的修建方案,使得任何乙個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重複經過大城市,從首都到達每個大城市的方案都是唯一的。j...

大臣的旅費

很久以前,t王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連線首都和王國內的各大城市。為節省經費,t國的大臣們經過思考,制定了一套優秀的修建方案,使得任何乙個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重複經過大城市,從首都到達每個大城市的方案都是唯一的。j是t國重要...

藍橋 大臣的旅費

問題描述 很久以前,t王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連線首都和王國內的各大城市。為節省經費,t國的大臣們經過思考,制定了一套優秀的修建方案,使得任何乙個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重複經過大城市,從首都到達每個大城市的方案都是唯一的。j...