逃離洞穴 escape

2021-07-15 09:18:25 字數 1906 閱讀 4373

題意

/description:

小z最近出去旅遊,遇上倒霉事了。他和旅遊團一起去遊洞穴。這裡有n個洞穴,編號為1到n。它們之間,有的有雙向的小路相連,有的卻沒有,不過所有洞穴都通過小路連在了一起,沒有任何兩個洞穴不能相互到達。當遊客們分散在各處的時候,忽然出了些故障,所有燈全部熄滅。這時廣播響起,要求遊客們迅速疏散。

有兩個洞穴是出口,分別編號1和n,每個遊客都選擇最短的路線,從某乙個出口逃離。所有的小路都是有長度的,而所有遊客的速度都認為是1。

現在請問,在給定的t時間內,最多有多少人可以逃離。另乙個問題,最慢的遊客離開需要多少時間。 讀入

/input

:第一行,三個整數,n,m和t,分別表示洞穴的數目,小路的數量和給定的逃離時間。

接下來m行,每行三個整數x,y和l,表示這條小路連線了編號為x和y的洞穴,而它的長度為l。x和y互不相同,且都在1到n之間。任何兩個洞穴之間最多只有一條小路將它們直接相連。

下一行,乙個整數k,表示遊客的數量。

最後一行,k個整數,每個都在1到n之間,表示每個遊客所在的洞穴(可能乙個洞穴會有多個人)。

輸出/output:

輸出兩行,每行乙個整數。第一行輸出t時間內多少人可以逃離,第二行輸出最慢的遊客逃離洞穴所需要的時間。題解/

solution

:floyd做,最後統計。

**/code:

var

n,m,time,ans,max:longint;

a:array [0..501,0..501] of longint;

sum:array [0..501] of longint;

bo:array [0..501] of boolean;

procedure init;

var i,x,y,z,k:longint;

begin

fillchar(sum,sizeof(sum),0);

fillchar(a,sizeof(a),$7f div 3);

readln(n,m,time);

for i:=1 to m do

begin

readln(x,y,z);

a[x,y]:=z; a[y,x]:=z;

end;

fillchar(bo,sizeof(bo),false);

readln(k);

ans:=0; max:=0;

for i:=1 to k do

begin

read(x);

sum[x]:=sum[x]+1;

bo[x]:=true;

end;

end;

function min(o,p:longint):longint;

begin

if oi) and (k<>j) and (i<>j) then

a[i,j]:=min(a[i,j],a[i,k]+a[k,j]);

end;

procedure print;

var i,t:longint;

begin

ans:=sum[1]+sum[n]; max:=0;

for i:=2 to n-1 do

if bo[i] then

begin

if (a[i,1]<=time) or (a[i,n]<=time) then

ans:=ans+sum[i];

t:=min(a[i,1],a[i,n]);

if t>max then max:=t;

end;

writeln(ans);

write(max);

end;

begin

init;

main;

print;

end.

1754 逃離洞穴

基礎bfs題目的變形,在結構體裡設定答案,在狀態更新後才進行判斷。兩個基礎的bfs.include include include using namespace std intconst maxn 2000 int vis maxn maxn int rr,cc char map maxn max...

LCT 洞穴勘測

codevs洞穴勘測原題戳這裡 題目大意 建路 connect u v 毀路 destroy u v 查詢路是否聯通 query u v 用到的幾個基本操作,link,cut,access,reverse,find 本題中所用到的ch和fa,為splay樹上的,與原樹沒有關係 博主個人愛好結構體,不...

死亡洞穴 cave

題目背景 在 caima 的 rpg 遊戲中,控制著兩個人 vv 和 jj。這次 vv 和 jj 掉入了乙個死亡洞穴,洞穴是乙個 n m 的矩陣。之所以稱之 為死亡洞穴,是因為在這個矩陣中有一些死亡十字。如下圖中的 v j 由於 vv 和 jj 被分撒在了兩地,而 jj 還受了重傷,你需要讓 vv ...