題意:卡車要運輸盡可能高的貨物(但不高於乙個安全值),城市間每一條路是雙向的但是都有高度限制。求解運輸盡可能高的貨物時,卡車到達目的地的最短路徑。單源最短路徑的變形,在最短路徑基礎上加了高度限制。
思路:採用二分搜尋法+修改的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分鐘之內的體積...