hdu 2962 Trucking(二分 最短路)

2021-08-03 06:58:54 字數 1468 閱讀 8582

題意:卡車要運輸盡可能高的貨物(但不高於乙個安全值),城市間每一條路是雙向的但是都有高度限制。求解運輸盡可能高的貨物時,卡車到達目的地的最短路徑。

單源最短路徑的變形,在最短路徑基礎上加了高度限制。

思路:採用二分搜尋法+修改的dijkstra,取高度最大的最短路徑就是答案。(當列舉太慢,且每次判斷都只有兩種可能時,優先考慮二分)

先求高度mid=(l+r)/2,若在mid的高度限制下,dijkstra函式能到達終點(判斷dist[dest]的值是否有效),則繼續試探[mid+1, r]這一段,否則試探[l, mid-1]這一段。用maxh記錄每一次能通行的高度mid並更新,shorteset記錄mid高度下通行的最短路徑長度。

在dijkstra函式的實現可以是樸素的,也可以是最小優先佇列優化的,兩者實現上分別要注意:

#include 

#include

#include

#include

using

namespace

std;

const

int maxn = 1005, inf = 1

<< 27;

typedef pair p; //first代表距離,second代表頂點編號

int n, road;

int cost[maxn][maxn], height[maxn][maxn]; //記錄兩點間代價和高度

int dist[maxn];

bool visited[maxn];

void init()

void dijkstra(int s, int h) //樸素dijkstra

}if (pos == -1) break; //結束

visited[pos] = true; //標記pos訪問過

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

}}void dijkstra_optimized(int s, int h) //最小優先佇列優化的dijkstra}}

}int main()

cin >> src >> dest >> limit;

int l = 0, r = limit;

int shortest = inf, maxh = inf;

//對限制的高度二分, 使其能通過且最大

while(l <= r)

else r = mid-1; //右界縮小

}cout

<< "case "

<< kase << ":"

<< endl;

if (shortest == inf || maxh == inf) //無法通過

cout

<< "cannot reach destination"

<< endl;

else

}return

0;}

hdu 2962 最短路 二分

題意 最短路上有一條高度限制,給起點和最大高度,求滿足高度最大情況下,最短路的距離 不明白為什麼列舉所有高度就不對 1 include2 include3 include4 const int maxint 999999 5 int c 1005 1005 2 dist 1005 h 1005 6 ...

hdu 2962(二分答案 最短路)

題目大意 給你城市數c,道路數r,運載車的限高h,以及每條道路的限高limit,讓你求start到end的貨物的最大高度res res limit,res h 和在貨物最大高度下,從start到end的最短路。大體思路 二分答案 res 1.h 然後再求最大高度下的最短路即可。具體看 include...

hdu 1839(最短路 二分)

hdu 1839 1 題意 有n個點,m條路徑,1是起點,n是終點,最多tmin 經過一條路徑需要花費d分鐘,這條路徑的最大容積是c,就是只有容積小於路徑容積的貨物才能通過。問從1 n在t分鐘內,最多能運多少體積的貨物。2 思路 記錄所有的體積,從小到大排序,二分查詢最大且時間之和在t分鐘之內的體積...