題目背景
在艾澤拉斯大陸上有一位名叫歪嘴哦的神奇術士,他是部落的中堅力量
有一天他醒來後發現自己居然到了聯盟的主城暴風城
在被眾多聯盟的士兵攻擊後,他決定逃回自己的家鄉奧格瑞瑪
題目描述
在艾澤拉斯,有n個城市。編號為1,2,3,…,n。
城市之間有m條雙向的公路,連線著兩個城市,從某個城市到另乙個城市,會遭到聯盟的攻擊,進而損失一定的血量。
每次經過乙個城市,都會被收取一定的過路費(包括起點和終點)。路上並沒有收費站。
假設1為暴風城,n為奧格瑞瑪,而他的血量最多為b,出發時他的血量是滿的。
歪嘴哦不希望花很多錢,他想知道,在可以到達奧格瑞瑪的情況下,他所經過的所有城市中最多的一次收取的費用的最小值是多少。
輸入格式
第一行3個正整數,n,m,b。分別表示有n個城市,m條公路,歪嘴哦的血量為b。
接下來有n行,每行1個正整數,fi。表示經過城市i,需要交費fi元。
再接下來有m行,每行3個正整數,ai,bi,ci(1<=ai,bi<=n)。表示城市ai和城市bi之間有一條公路,如果從城市ai到城市bi,或者從城市bi到城市ai,會損失ci的血量。
輸出格式
僅乙個整數,表示歪嘴哦交費最多的一次的最小值。
如果他無法到達奧格瑞瑪,輸出afk。
輸入輸出樣例
輸入 #1
4 4 885輸出 #1 說明/提示6102 1 2
2 4 1
1 3 4
3 4 3
對於60%的資料,滿足n≤200,m≤10000,b≤200
對於100%的資料,滿足n≤10000,m≤50000,b≤1000000000
對於100%的資料,滿足ci≤1000000000,fi≤1000000000,可能有兩條邊連線著相同的城市。
分析:這個題目的意思就是說,有個人要從城市1走到城市n,每從乙個城市到另乙個城市,會損失一定的血量。且經過乙個城市時,需要收取一定過路費(包括起點和終點)。
題目要求的是(劃重點)他的到達路線中,所有點的收費值的最大值中,取最小值輸出(是不是有點拗口)
理解了題目意思後,這道題目就有了基本思路了。看了大佬題解說的,所有類似於「求解所有的最大值中的最小值」的問題,都應該先想一想用二分答案的方法來寫。為什麼呢?因為二分答案就是用來求解這種問題的,它通過猜測目前的答案+驗證目前答案是否成立來求解,這種「假設已經知道答案」的方法比用題目資訊求解答案的方法要優秀很多,而且複雜度也僅僅是加了乙個log。
但是還要注意一點,除了這種經典問法以外,還要通過答案是否具有單調性來判斷是否可以使用二分答案的方法
不具有單調性的問題是不可以使用這種方法的!
然後看題目,有血量和費用兩個變數,血量和每條邊是繫結在一起的,所以我們可以看作每條邊的長度,然後二分費用,每次求最短路時每條路的費用都不能超過這個二分所得的費用,求出最短路長度判斷血量是否還有剩餘即可。
具體看**如下
#include
#include
#include
#include
#include
using
namespace std;
const
int inf=
1000000010
;int n,m,b;
//dijkstra演算法+堆優化+鏈式前向星存圖+二分查詢
struct node
;struct node};
node e[
100005];
int head[
10005];
int cost[
10005];
//記錄每個點的花費
int c[
10005];
//記錄排序後的所花的費用
int d[
10005];
int vis[
10005];
int cnt;
void
add(
int a,
int b,
int c)
bool
check
(int top));
while
(!p.
empty()
));}
}}if(d[n]
>b)
//判斷血量是否還夠
return
false
;else
return
true;}
intmain()
for(
int i=
1;i<=m;i++
)sort
(c+1
,c+1
+n);if(
check
(inf)
==false
)int l=
1,r=n;
int ans=0;
while
(l<=r)
else
l=mid+1;
}printf
("%d\n"
,ans);}
return0;
}
敲**好難啊orz P1462 通往奧格瑞瑪的道路
在艾澤拉斯大陸上有一位名叫歪嘴哦的神奇術士,他是部落的中堅力量 有一天他醒來後發現自己居然到了聯盟的主城暴風城 在被眾多聯盟的士兵攻擊後,他決定逃回自己的家鄉奧格瑞瑪 在艾澤拉斯,有n個城市。編號為1,2,3,n。城市之間有m條雙向的公路,連線著兩個城市,從某個城市到另乙個城市,會遭到聯盟的攻擊,進...
P1462 通往奧格瑞瑪的道路
單調性 對於要求的所經過的所有城市中最多的一次收取的費用的最小值越小,滿足條件的道路就越少。所以,我們二分經過的所有城市中收取的費用的最大值 但check函式怎麼寫呢?我們以經過的邊所扣的血量為邊權,1為源點跑一邊最短路。在最短路過程中用於鬆弛dis陣列的邊的終點的點權必須 如果跑出的 includ...
P1462 通往奧格瑞瑪的道路
在艾澤拉斯大陸上有一位名叫歪嘴哦的神奇術士,他是部落的中堅力量 有一天他醒來後發現自己居然到了聯盟的主城暴風城 在被眾多聯盟的士兵攻擊後,他決定逃回自己的家鄉奧格瑞瑪 在艾澤拉斯,有n個城市。編號為1,2,3,n。城市之間有m條雙向的公路,連線著兩個城市,從某個城市到另乙個城市,會遭到聯盟的攻擊,進...