(dijkstra,二分答案)P1396 營救

2021-10-02 20:23:12 字數 1680 閱讀 7515

這道題讓筆者想起了通往奧格瑞瑪的道路這道題,可以說是有異曲同工之妙了。首先題目明確說明了,求最大值最小。一般這樣的就與二分答案有關,於是我們記錄下來每條邊的長度,答案一定是這些長度中的乙個,然後將各邊的長度排序,二分答案就行了(相當於套乙個二分答案的板子和乙個dijkstra的板子)。細節處理在**注釋上。

當然本題還有並查集等其它解法,這個隨後補上。

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace std;

const

int maxn=

1000005

;const

int inf=

0x3f3f3f3f

;

ll d[maxn]

;bool done[maxn]

;int n,m;

struct edge

edge()

:from(0

),to(

0),dist(0

)};vector edges;

vector edges2;

//check要改邊,所以要備份

vector<

int> mp[maxn]

;vector<

int> mp2[maxn]

;void

addedge

(int from,

int to,

int dist)

void

addedge2

(int from,

int to,

int dist)

struct heapnode

heapnode()

:num(0

),dis(0)

bool

operator

<

(const heapnode& buf)

const};

priority_queue q;

void

dijkstra

(int s)}}

}int pos;

int s,t;

//本題很像通往奧格瑞瑪的道路

int edg[maxn]

;//把每條邊長度儲存起來,再排序,然後二分答案,每次在dijkstra的每條邊中做處理,把比二分的答案長的邊全部「封鎖掉」

int cnt;

int ans;

void

init()

}bool

check

(int cur)

dijkstra

(s);

if(d[t]

>=inf)

else

}int

main()

int l=

1,r=cnt;

sort

(edg+

1,edg+cnt+1)

;while

(l<=r)

else l=mid+1;

}printf

("%d"

,ans)

;return0;

}

hiho week 38 P1 二分 二分答案

time limit 10000ms case time limit 1000ms memory limit 256mb 描述 在上一回和上上回里我們知道nettle在玩 艦 nettle在整理好艦隊之後終於準備出海撈船和敵軍交戰了。在這個遊戲裡面,海域是n個戰略點 編號1.n 組成,如下圖所示 其...

二分查詢與二分答案

主要用於在乙個單調的函式中查詢某值 連續函式的情況 若當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y 則 l mid,否則 r mid 直至 r l eps 當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y...

二分查詢和二分答案

1.解釋 優點 查詢速度快。缺點 待查表為有序表。4.時間複雜度 o log n 5.示例 p2249查詢 include include using namespace std long long n,m,a 1000005 b 100005 l,r,mid,cnt,x intmain for i...