外星人入侵 紀中3077 spfa 玄學優化

2021-07-16 19:49:56 字數 2681 閱讀 6429

外星人入侵地球。可怕的吃人外星人正在全國各地依次序建立它們的基地。

全國共有n(1≤ n ≤10,000)座城市,城市編號1~n。城市之間有m(0≤ m ≤100,000)條雙向道路相連。外星人計畫建立a(0≤a≤n)個基地。

你只有在距離當前所有外星人基地至少k(1≤k≤100)單位長度的城市才能得到安全。

所以你必須趕快寫乙個程式決定走到**去。

第1行:4個整數n, m, a, k

接下來m行,每行3個整數t1, t2(1≤t1

共a行,第i行1個整數,表示當外星人建好第i個基地後,距離當前所有基地b1,b2,…,bi至少k長度的城市的數量。

我們要想到,隨著新的基地的加入,最短距離不小於k的頂點數量是單調不增的,而且乙個頂點一旦進入最短距離小於k的集合,是不可能再跳出那個集合的。

這樣,我們可以維護乙個全域性變數ans,它的初值是第1次最短路後符合條件的頂點數。

在隨後的最短路演算法中,只要乙個f[i]小於k,就從ans中減1。

這樣就可以在每次最短路演算法後,直接輸出ans得解。

如果ans=0,那不用跑spfa,直接輸出0就好了。

const

maxn=20000;

maxe=210000;

type

arr=record

x,y,w:longint;

next:longint;

end;

var edge:array[1..maxe] of arr;

f:array[1..maxn] of longint;

ls:array[1..maxn] of longint;

ans:array[1..maxn] of boolean;

status:array[1..maxn] of boolean;

queue:array[1..maxe*10] of longint;

n,m,nm:longint;

a,dis:longint;

max:longint;

procedure

add(x,y,w:longint);

begin

nm:=nm+1;

edge[nm].x:=x;

edge[nm].y:=y;

edge[nm].w:=w;

edge[nm].next:=ls[x];

ls[x]:=nm;

end;

procedure

init;

var i,j,k:longint;

x,y,w:longint;

begin

readln(n,m,a,dis);

for i:=1

to m do

begin

readln(x,y,w);

add(x,y,w);

add(y,x,w);

end;

end;

procedure

spfa

(s:longint);

var i,j,k:longint;

head,tail:longint;

begin

fillchar(f,sizeof(f),$7f);

fillchar(status,sizeof(status),false);

head:=0; tail:=1;

queue[1]:=s;

status[s]:=true;

f[s]:=0;

repeat

head:=head+1;

i:=ls[queue[head]];

while i<>0

dowith edge[i] do

begin

if f[x]+wthen

begin

f[y]:=f[x]+w;

ifnot status[y]

then

begin

tail:=tail+1;

queue[tail]:=y;

status[y]:=true;

end;

end;

i:=next;

end;

status[queue[head]]:=false;

until head=tail;

end;

procedure

main;

var i,j,k:longint;

begin

max:=n;

for i:=1

to a do

begin

readln(j);

if max=0

then

begin

writeln(0);

continue;

end;

spfa(j);

for k:=1

to n do

if (ans[k]) or (f[k]then

ifnot ans[k]

then

begin

ans[k]:=true;

max:=max-1;

end;

writeln(max);

end;

end;

begin

init;

main;

end.

外星人入侵

今天是乙個週末,宿舍的人全部都出去玩了,而我因為太懶乙個人留在了宿舍,連床都不起,吃飯靠的是點外賣。不過,為了好玩,我跟著書本學習打了乙個2d小遊戲,並加入了一點自己的東西。一 遊戲頁面 剛開始我把所有的遊戲螢幕設定都放在了下面 裡,這使得 看起來非常長,和雜亂,所以為了使遊戲方便擴充套件和整個 邏...

Pygame 外星人入侵(7)外星人壓境

二 更加合理地移動 三 小結 在之前的博文中,實現了在螢幕上繪製一大群外星人,現在我們想讓這群外星人動起來,它們的移動遵循著一定的規律。我們首先要實現的是,如何讓一群外星人一起向螢幕右側移動。遊戲引數性質的變數統一存放在 設定模組中的設定類中 6 外星人的屬性 6。1 外星人移動的速度 self.a...

外星人入侵 Standard IO

description 外星人入侵地球。可怕的吃人外星人正在全國各地依次序建立它們的基地。全國共有n 1 n 10,000 座城市,城市編號1 n。城市之間有m 0 m 100,000 條雙向道路相連。外星人計畫建立a 0 a n 個基地。你只有在距離當前所有外星人基地至少k 1 k 100 單位長...