P1462 通往奧格瑞瑪的道路

2022-09-19 18:57:10 字數 1447 閱讀 8291

在艾澤拉斯大陸上有一位名叫歪嘴哦的神奇術士,他是部落的中堅力量。

有一天他醒來後發現自己居然到了聯盟的主城暴風城。

在被眾多聯盟的士兵攻擊後,他決定逃回自己的家鄉奧格瑞瑪。

在艾澤拉斯,有 \(n\) 個城市。編號為 \(1,2,3,\ldots,n\)。

城市之間有 \(m\) 條雙向的公路,連線著兩個城市,從某個城市到另乙個城市,會遭到聯盟的攻擊,進而損失一定的血量。

每次經過乙個城市,都會被收取一定的過路費(包括起點和終點)。路上並沒有收費站。

假設 \(1\) 為暴風城,\(n\) 為奧格瑞瑪,而他的血量最多為 \(b\),出發時他的血量是滿的。

歪嘴哦不希望花很多錢,他想知道,在可以到達奧格瑞瑪的情況下,他所經過的所有城市中最多的一次收取的費用的最小值是多少。

二分答案暗示了我們這道題需要用到二分。

我們可以二分題面中的歪嘴哦交費最多的一次的最小值

那熟悉的\(check\)函式呢?標籤說了要用spfa,那就跑spfa,求從暴風城到奧格瑞瑪的最小損血是否大於血量就完了。

那什麼時候輸出afk呢?當然是在無窮多的血量也無法到達的時候啦!

int l=1,r=n;

int ans;

while(l<=r)

else

}

最終**如下所示:

#includeusing namespace std;

const int size = 10010;

const int esize = 100010;

const int inf=0x3f3f3f3f;

struct eedge[esize];

int cnt;

int head[size];

int add(int a,int b,int c)

int n,m,b;

int f[size];

int u[size];

int dist[size];

bool v[size];

bool spfa(int top)}}

}if(dist[n]<=b)

else

}bool check(int top)

int main()

for(int i=1;i<=m;i++)

sort(u+1,u+n+1);

if(!spfa(inf))

int l=1,r=n;

int ans;

while(l<=r)

else

} cout<

return 0;

}

P1462 通往奧格瑞瑪的道路

在艾澤拉斯大陸上有一位名叫歪嘴哦的神奇術士,他是部落的中堅力量 有一天他醒來後發現自己居然到了聯盟的主城暴風城 在被眾多聯盟的士兵攻擊後,他決定逃回自己的家鄉奧格瑞瑪 在艾澤拉斯,有n個城市。編號為1,2,3,n。城市之間有m條雙向的公路,連線著兩個城市,從某個城市到另乙個城市,會遭到聯盟的攻擊,進...

P1462 通往奧格瑞瑪的道路

單調性 對於要求的所經過的所有城市中最多的一次收取的費用的最小值越小,滿足條件的道路就越少。所以,我們二分經過的所有城市中收取的費用的最大值 但check函式怎麼寫呢?我們以經過的邊所扣的血量為邊權,1為源點跑一邊最短路。在最短路過程中用於鬆弛dis陣列的邊的終點的點權必須 如果跑出的 includ...

P1462 通往奧格瑞瑪的道路

題目背景 在艾澤拉斯大陸上有一位名叫歪嘴哦的神奇術士,他是部落的中堅力量 有一天他醒來後發現自己居然到了聯盟的主城暴風城 在被眾多聯盟的士兵攻擊後,他決定逃回自己的家鄉奧格瑞瑪 題目描述 在艾澤拉斯,有n個城市。編號為1,2,3,n。城市之間有m條雙向的公路,連線著兩個城市,從某個城市到另乙個城市,...