二分 最短路 dijkstra

2022-05-16 21:24:02 字數 2195 閱讀 9951

洛谷p1462 通往奧格瑞瑪的道路

對於我這個只是聽過二分但是從來沒有寫過二分的人來說,看到這個題目時是懵逼的,啥是求最多一次收費的最小值,只能回頭開始學習二分,在一下幾種情況下,均可以用二分來解決。

1.從有序陣列中查詢某個值。

2.假定乙個解並判斷是否可行

3.最大化最小值

4.最大化平均值

這個題目中涉及到的就是第三種情況。

再次重新說一下題意,給定起點和終點,設為1和n,那麼從1到n有很多條路,我們設每一條路徑為ai,因為每個路徑經過的點的集合不一樣,並且經過每乙個點都要被收取那個點所對應的過路費,因為每個點的過路費不同,所以我們把對於每一條路徑ai,都有乙個過路費最高的點,那麼我們設這個最高的點的過路費為f(ai),那麼假設這個圖中有m條路,那麼我們要做的就是求f(a1)、f(a2)······f(am)中最小的那個值,這個就是最大化最小值。

解題思路:

那麼根據求什麼就二分什麼來看(大部分情況下),我們這一題就應該二分費用。首先我們需要把所有點的費用進行排序,剩下的就是二分了,為了方便理解,這裡先說最短路應該怎麼處理。首先最基本的dijkstra我這裡就不說了,我用的是優先佇列化簡,我在這裡就說一下dijkstra在這一題當中需要做什麼改動,我們二分的是費用,並且是每一條路中最大的費用,所以在跑dijkstra的時候當某個點的費用大於我們設定的這個費用的時候,這個點就是無效的,即為不能取,所以我們只需要在剛開始的時候把這些點全部標記一遍就可以了,我這裡用的是把所有點的狀態變為black(即為不能選)。

在知道了如何求最短路之後我們只需要不斷的二分這個最大費用就可以了,這個就直接看**吧,最基本的二分。

1

while(head<=end)29

else

10 head=mid+1

;11 }

接下來就是ac**

1 #include 2 #include 3 #include 

4 #include 5 #include 6 #include 7 #include 8 #include 9 #include

1011

using

namespace

std;

12#define ll long long

13static

const

int white=0;14

static

const

int gray=1;15

static

const

int black=2;16

static

const

int infty=(1

<<30

);17 vectorint,int> > adj[10005

];18

intn,m,b;

19int f[10005],fi[10005

];20

bool dijkstra(int

k)21

31for(int i=1;i<=n;i++)//

將不滿足該路徑條件的點排除

32

36 d[1]=0

;37 que.push(make_pair(0,1

));38 color[1]=gray;

39while (!que.empty())//

模板4058}

59}60if(d[n]>=b)

61return

false

;

62else

63return

true;64

}65intmain()

6673

for(int i=1;i<=m;i++)//

鄰接表建圖

7480 sort(f+1,f+n+1

);81

int head=1,end=n;

82int ans=infty;

83if(!dijkstra(f[n]))//

如果最大的費用都不通的話,一定不通

8488

while(head<=end)//

二分89

96else

97 head=mid+1;98

}99 printf("

%d\n

",f[ans]);

100return0;

101 }

csu1307 最短路 二分

time limit 1 sec memory limit 128 mb submit 392 solved 68 submit status web board alice想要從城市a出發到城市b,由於alice最近比較窮 不像集訓隊陳興老師是個rich second 所以只能選擇做火車從a到b。...

bzoj 1614 二分 最短路

題意 找一條將1號和n號 線桿連起來的路徑,其餘的 線桿並不一定要連入 網路。電信公司最終同意免費為fj鏈結k對由fj指定的 線桿。對於此外的那些 線,要求最大邊最小 明顯的二分答案,因為只要求1號和n號連起來,其他點不要求,所以跑最短路即可 對於二分出mid,我們check時,找到1號到n號的最短...

NightMare2 (二分 最短路)

time limit 5000 ms memory limit 65536 k 可憐的runningphoton又做噩夢了。但是這次跟上次不大一樣,雖然他又被困在迷宮裡,又被裝上了乙個定時炸彈,但是值得高興的是,他發現他身邊有數不清的財寶,所以他如果能帶著這些財寶並活著逃出去的話,他就發財啦。不過,...