雙端佇列 二分 通訊線路

2021-10-02 07:16:19 字數 1476 閱讀 6317

在郊區有 n 座通訊基站,p 條 雙向 電纜,第 i 條電纜連線基站ai和bi。

特別地,1 號基站是通訊公司的總站,n 號基站位於一座農場中。

現在,農場主希望對通訊線路進行公升級,其中公升級第 i 條電纜需要花費li。

**公司正在舉行優惠活動。

農產主可以指定一條從 1 號基站到 n 號基站的路徑,並指定路徑上不超過 k 條電纜,由**公司免費提供公升級服務。

農場主只需要支付在該路徑上剩餘的電纜中,公升級**最貴的那條電纜的花費即可。

求至少用多少錢可以完成公升級。

輸入格式

第1行:三個整數n,p,k。

第2…p+1行:第 i+1 行包含三個整數ai,bi,li。

輸出格式

包含乙個整數表示最少花費。

若1號基站與n號基站之間不存在路徑,則輸出」-1」。

資料範圍

0 ≤k

1000

,0≤k0≤

k1000,1≤

p≤

10000

1≤p≤10000

1≤p≤10

000,

1 ≤l

i≤

1000000

1≤l_i≤1000000

1≤li​≤

1000

000輸入樣例:

5 7 1

1 2 5

3 1 4

2 4 8

3 2 3

5 2 9

3 4 7

4 5 6

輸出樣例:

4這道題,題目中很明顯的意圖就是讓我們求最小的最大值,這個一般都是用二分來做的。我們這道題二分的如果大於乙個值,則邊權為1,否則為0,所以求0,1的這種最短路我們又可以用雙端佇列來做。在我們二分處理完後就是我們的第k+1大的邊,也就是我們的答案。

#include

using

namespace std;

const

int n=

20010

;int ne[n]

,e[n]

,cnt,head[n]

,w[n]

,n,p,k,dis[n]

;bool vis[n]

;deque<

int>q;

void

add(

int a,

int b,

int c)

bool

check

(int bound)}}

return dis[n]

<=k;

}int

main()

int l=

0,r=

1e6+1;

while

(lif(r==

1e6+

1) r=-1

; cout

}

340 通訊線路(二分答案 spfa)

在郊區有 n 座通訊基站,p 條 雙向 電纜,第 i 條電纜連線基站ai和bi。特別地,1 號基站是通訊公司的總站,n 號基站位於一座農場中。現在,農場主希望對通訊線路進行公升級,其中公升級第 i 條電纜需要花費li。公司正在舉行優惠活動。農產主可以指定一條從 1 號基站到 n 號基站的路徑,並指定...

AcWing 340 通訊線路

在郊區有 n 座通訊基站,p 條 雙向 電纜,第 i 條電纜連線基站ai和bi。特別地,1 號基站是通訊公司的總站,n 號基站位於一座農場中。現在,農場主希望對通訊線路進行公升級,其中公升級第 i 條電纜需要花費li。公司正在舉行優惠活動。農產主可以指定一條從 1 號基站到 n 號基站的路徑,並指定...

COGS T 7 通訊線路

輸入檔案 mcst.in輸出檔案 mcst.out簡單對比 時間限制 1.5 s 記憶體限制 128 mb 問題描述 假設要在n個城市之間建立通訊聯絡網,則連通n個城市只需要n 1條線路。這時,如何在最少經費的前提下建立這個通訊網。在每兩個城市之間都可以設定 條線路,相應地都要付出一定的經濟代價。n...