洛谷P3393逃離殭屍島 最短路

2022-04-29 21:30:58 字數 2965 閱讀 7301

貌似一直不寫題解不太好qaq 但是找不到題啊...

隨便寫點水題來補部落格吧

題目不pa了,點鏈結吧...

點我看題

很明顯這是道sb題...

思路:  對於每乙個殭屍城市預處理其 s 距離內的城市,然後用個cost陣列記錄點權,然後直接跑spfa就好了。

看下資料,可以發現如果k值較大有可能會tle(沒測不知道qaq)。所以加個簡單的優化就可以吧(可能吧qaq)。

簡單的優化就是在預處理的時候如果某乙個殭屍城市 s 距離內的城市有另外的殭屍城市,辣麼這個殭屍城市可以不入隊,這樣可以少掉一點重複的無效搜尋。

依舊看一下資料 發現答案會爆 int 所以就記得開 int64(long long)。

所以看資料是可以看出坑點的... (完美避開=v=

然後直接**吧。

type

node=record

y:longint;

next:longint;

end;var

n,m,k,s:longint;

tot:longint;

cost1,cost2:longint;

x,y:longint;

i:longint;

cost,first,a:

array[0..100050]of

longint;

q:array[0..1000000]of

longint;

e:array[0..400200]of

node;

dist:

array[0..100050]of

int64;

v:array[0..100050]of

boolean;

procedure

adde(x,y:longint);

begin

e[tot].next:=first[x];

e[tot].y:=y;

first[x]:=tot;

inc(tot);

end;

procedure

bfs(x:longint);

varhead,tail:longint;

now,y,i:longint;

begin

head:=1

; tail:=1;

for i:=1

to n do

dist[i]:=-1

; dist[x]:=0

; q[

1]:=x;

while head<=tail do

begin

now:=q[head];

i:=first[now];

while i<>-1

dobegin

y:=e[i].y;

if (dist[y]<0)and(cost[y]>=0) then

begin

dist[y]:=dist[now]+1

; cost[y]:=cost2;

if dist[y]then

begin

inc(tail);

q[tail]:=y;

end;

end;

i:=e[i].next;

end;

inc(head);

end;end

;procedure

spfa(s:longint);

varhead,tail:longint;

now,y,i:longint;

begin

head:=1

; tail:=1;

for i:=1

to n do

begin

dist[i]:=1

<< 35

; v[i]:=false;

end; dist[s]:=0

; q[

1]:=s;

v[s]:=true;

while head<=tail do

begin

now:=q[head];

i:=first[now];

while i<>-1

dobegin

y:=e[i].y;

if (dist[y]>dist[now]+cost[y])and(cost[y]>=0) then

begin

dist[y]:=dist[now]+cost[y];

ifnot v[y] then

begin

inc(tail);

q[tail]:=y;

v[y]:=true;

end;

end;

i:=e[i].next;

end;

inc(head);

v[now]:=false;

end;end

;begin

read(n,m,k,s);

read(cost1,cost2);

for i:=1

to k do

begin

read(a[i]);

cost[a[i]]:=-1;

end;

for i:=1

to n do

first[i]:=-1;

for i:=1

to m do

begin

read(x,y);

adde(x,y);

adde(y,x);

end;

for i:=1

to k do

bfs(a[i]);

for i:=1

to n do

if cost[i]=0

then cost[i]:=cost1;

spfa(1);

writeln(dist[n]-cost[n]);

end.

view code

洛谷 P3393 逃離殭屍島

題目描述 小a住的國家被殭屍侵略了!小a打算逃離到該國唯一的國際空港逃出這個國家。該國有n個城市,城市之間有道路相連。一共有m條雙向道路。保證沒有自環和重邊。k個城市已經被殭屍控制了,如果貿然闖入就會被感染tat 所以不能進入。由其中任意城市經過不超過s條道路就可以到達的別的城市,就是危險城市。換句...

洛谷 P3393 逃離殭屍島

小a住的國家被殭屍侵略了!小a打算逃離到該國唯一的國際空港逃出這個國家。該國有n個城市,城市之間有道路相連。一共有m條雙向道路。保證沒有自環和重邊。k個城市已經被殭屍控制了,如果貿然闖入就會被感染tat.所以不能進入。由其中任意城市經過不超過s條道路就可以到達的別的城市,就是危險城市。換句話說只要某...

洛谷P3393 逃離殭屍島

題目大意 有n個城市m條雙向道路,還有k個已經被殭屍占領的城市,規定 被占領城市不能經過,走不超過s條道路就能到達被占領城市的算危險城市,路費q,其他城市算安全城市,路費p。求從1走到n的最少花費 1和n路費為0 解題思路 我們先跑一遍bfs,求出哪些是危險城市,然後記錄每個城市的路費 貌似int會...