題目大意:
歪嘴哦想去奧格瑞瑪即城市n,如果能到達的話,求在可行的所有路徑中,交費最多的一次的最小值,不能到達輸出「afk」。
題解:
二分查詢+spfa+佇列:
1.找出城市中最小收費跟最大收費,然後對費用做2分查詢。
2.對於二分的費用mid,做spfa,如果i可以到達奧格瑞瑪且血量不超過歪嘴哦的血量就向前二分,不然到達就向後二分。
3.如果二分做完了,還不能到達就輸出「afk」,否則輸出二分的結果。
var
c,s,t,w,next,list:array [0..100001] of int64;
a,d:array [0..10001] of int64;
v:array [0..10001] of boolean;
min,max,i,n,m,p,q,ans:longint;
function
spfa
(main:longint):boolean;
var head,tail,j:longint;
begin
d[1]:=w[1]; for j:=2
to n do d[j]:=maxlongint;
v[1]:=true; for j:=2
to n do v[j]:=false;
head:=0;
tail:=1;
c[1]:=1;
while headdo
begin
inc(head);
j:=list[c[head]];
while j>0
dobegin
if (a[t[j]]<=main) and (d[s[j]]+w[j]then
begin
d[t[j]]:=d[s[j]]+w[j];
if v[t[j]]=false
then
begin
v[t[j]]:=true;
inc(tail);
c[tail]:=t[j];
end;
end;
j:=next[j];
end;
v[c[head]]:=false;
end;
if d[n]<=p then
exit(true);
exit(false);
end;
procedure
find
(l,r:longint);
var mid:longint;
begin
if l>=r then
begin
if spfa(l) then writeln(l)
else writeln('afk');
halt
end;
mid:=(l+r) div
2; if spfa(mid)
then find(l,mid)
else find(mid+1,r);
end;
begin
readln(n,m,p);
min:=maxlongint; max:=0;
for i:=1
to n do
begin
readln(a[i]);
if a[i]then min:=a[i];
if a[i]>max then max:=a[i];
end;
for i:=1
to m do
begin
inc(q);
readln(s[q],t[q],w[q]);
next[q]:=list[s[q]];
list[s[q]]:=q;
inc(q);
s[q]:=t[q-1]; t[q]:=s[q-1]; w[q]:=w[q-1];
next[q]:=list[s[q]];
list[s[q]]:=q;
end;
find(min,max);
end.
洛谷 P1462通往奧格瑞瑪的道路
題目背景 background 在艾澤拉斯大陸上有一位名叫歪嘴哦的神奇術士,他是部落的中堅力量 有一天他醒來後發現自己居然到了聯盟的主城暴風城 在被眾多聯盟的士兵攻擊後,他決定逃回自己的家鄉奧格瑞瑪 題目描述 description 在艾澤拉斯,有n個城市。編號為1,2,3,n。城市之間有m條雙向的...
洛谷 P1462 通往奧格瑞瑪的道路
題目背景 在艾澤拉斯大陸上有一位名叫歪嘴哦的神奇術士,他是部落的中堅力量 有一天他醒來後發現自己居然到了聯盟的主城暴風城 在被眾多聯盟的士兵攻擊後,他決定逃回自己的家鄉奧格瑞瑪 題目描述 在艾澤拉斯,有n個城市。編號為1,2,3,n。城市之間有m條雙向的公路,連線著兩個城市,從某個城市到另乙個城市,...
洛谷 P1462 通往奧格瑞瑪的道路
在艾澤拉斯大陸上有一位名叫歪嘴哦的神奇術士,他是部落的中堅力量 有一天他醒來後發現自己居然到了聯盟的主城暴風城 在被眾多聯盟的士兵攻擊後,他決定逃回自己的家鄉奧格瑞瑪 在艾澤拉斯,有n個城市。編號為1,2,3,n。城市之間有m條雙向的公路,連線著兩個城市,從某個城市到另乙個城市,會遭到聯盟的攻擊,進...