洛谷 P1462 通往奧格瑞瑪的道路

2021-07-29 12:01:59 字數 2033 閱讀 5498

題目大意:

歪嘴哦想去奧格瑞瑪即城市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條雙向的公路,連線著兩個城市,從某個城市到另乙個城市,會遭到聯盟的攻擊,進...