題目傳送門
最近在刷有關圖論,dp的題單~
n個節點,m條雙向邊。每個節點有乙個權值\(f[i]\),每個邊有乙個邊權(\(edge[i].dis\)),起點編號是1,終點編號是n。讓你求對於每乙個b,使得\(1到n\)的最短路小於邊權和小於等於b且使得路徑上經過的最大的點權最小。
很明顯,對於「最大值最小」\(or\)「最小值最大」的問題,考慮二分;
我們二分列舉乙個節點限制\(now\),點權f大於now的點不會考慮進路徑,剩下的節點跑一遍最短路;
如果到終點的最短路的dis陣列,也就是最小邊權和小於now,說明當前的這條路徑減少的血量小於當前二分的血量,存在著最多的一次收取的費用的最小值更大的可能,我們就嘗試使\(r=mid-1\),將now值縮小,繼續二分下去。直到我們的l和r相差為1或者0.說明我們找到了那個最小的滿足條件的點權和。輸出即可。
對於二分的題目,一定要明確自己要二分得到的結果,並且要清楚地知道邊界情況的處理方式。如果想錯了可能你的樣例跑出來是對的,但是其他的一些資料會出鍋。
在這裡用的是spfa。也可以用dij
#include#include#include#include#include#define ll long long
#define re register
#define n 10007
#define inf 2147483646
using namespace std;
inline int read()
while(ch>='0'&&ch<='9')
return x*f;
}int n,m,b,num,hea[n],d[n],vis[n],f[n];
int u,v,w;
struct edgedge[n*20];
inline void add(int from,int to,int dis)
inline bool spfa(int now)
}} }
if(d[n]>1;
if(spfa(mid))
r=mid-1;
else l=mid+1;
} printf("%d",l);
return 0;
}
P1462 通往奧格瑞瑪的道路
在艾澤拉斯大陸上有一位名叫歪嘴哦的神奇術士,他是部落的中堅力量 有一天他醒來後發現自己居然到了聯盟的主城暴風城 在被眾多聯盟的士兵攻擊後,他決定逃回自己的家鄉奧格瑞瑪 在艾澤拉斯,有n個城市。編號為1,2,3,n。城市之間有m條雙向的公路,連線著兩個城市,從某個城市到另乙個城市,會遭到聯盟的攻擊,進...
P1462 通往奧格瑞瑪的道路
單調性 對於要求的所經過的所有城市中最多的一次收取的費用的最小值越小,滿足條件的道路就越少。所以,我們二分經過的所有城市中收取的費用的最大值 但check函式怎麼寫呢?我們以經過的邊所扣的血量為邊權,1為源點跑一邊最短路。在最短路過程中用於鬆弛dis陣列的邊的終點的點權必須 如果跑出的 includ...
P1462 通往奧格瑞瑪的道路
題目背景 在艾澤拉斯大陸上有一位名叫歪嘴哦的神奇術士,他是部落的中堅力量 有一天他醒來後發現自己居然到了聯盟的主城暴風城 在被眾多聯盟的士兵攻擊後,他決定逃回自己的家鄉奧格瑞瑪 題目描述 在艾澤拉斯,有n個城市。編號為1,2,3,n。城市之間有m條雙向的公路,連線著兩個城市,從某個城市到另乙個城市,...