尋找道路(codevs 3731)題解

2021-07-09 09:34:38 字數 2722 閱讀 5300

【問題描述】

在有向圖 g 中,每條邊的長度均為 1,現給定起點和終點,請你在圖中找一條從起點到 終點的路徑,該路徑滿足以下條件:

路徑上的所有點的出邊所指向的點都直接或間接與終點連通。

在滿足條件 1 的情況下使路徑最短。

注意:圖 g 中可能存在重邊和自環,題目保證終點沒有出邊。 請你輸出符合條件的路徑的長度。

3 21 22 1

1 3 -1

6 61 2

1 32 6

2 54 5

3 41 5 3

又是要用鄰接表的題,我又華麗麗地用了鄰接矩陣,加上當初sb一般的用廣搜+深搜去搜能到的頂點,用了兩個布林型陣列,求最短路的時候用了floyed(其實這個都沒什麼了,之前的就足夠mle了……),再次爆零……

ok,吐槽完之後,繼續來說正解。

鄰接表,不多說了,以後看到需要儲存邊的題目都去用鄰接表!管你有沒有權。由於這題需要判斷能否到達終點,於是我們需要反向儲存。一遍dfs找到所有不能直接或間接到達的點,將它們的所有的入邊的點全部刪掉,如果起點無法到達的話,就輸出-1,否則就是求最短路了。

1

type rec=record

2c,next:longint;

3end;4

var e:array[1..200000] of

rec;

5 g:array[1..10000] of

longint;

6efree,i,n,m,k,x,y,s,t,j:longint;

7 a:array[1..10000] of

longint;

8 f,flag:array[1..10000] of

boolean;

9procedure

add;

10begin

11 e[efree].c:=x;

12 e[efree].next:=g[y];

13 g[y]:=efree;

14inc(efree);

15end;16

procedure

dfs(x:longint);

17var

j:longint;

18begin

19 f[x]:=true;

20 j:=g[x];

21while j<>0

do22

begin

23if

not f[e[j].c] then

24dfs(e[j].c);

25 j:=e[j].next;

26end;27

end;

28procedure

dijkstra;

29var

i,j,min,pos:longint;

30begin

31fillchar(f,sizeof(f),false);

32 f[t]:=true;

33 a[t]:=0;34

for j:=1

to n do

35begin

36 pos:=t;

37 min:=maxint;

38for i:=1

to n do

39if (not f[i])and(a[i]and(flag[i]) then

40begin

41 pos:=i;

42 min:=a[i];

43end

;44 f[pos]:=true;

45 i:=g[pos];

46while i<>0

do47

begin

48if flag[e[i].c] then

49if a[e[i].c]>a[pos]+1

then

50 a[e[i].c]:=a[pos]+1

;51 i:=e[i].next;

52end;53

end;

54end;55

begin

56readln(n,m);

57 efree:=1;58

for i:=1

to m do

59begin

60readln(x,y);

61add;

62end;63

readln(s,t);

64dfs(t);

65 flag:=f;

66for i:=1

to n do

67if

not f[i] then

68begin

69 j:=g[i];

70while j<>0

do71

begin

72 flag[e[j].c]:=false;

73 j:=e[j].next;

74end;75

end;

76if

not flag[s] then

77begin

78 writeln(-1

);79

halt;

80end;81

for i:=1

to n do

82 a[i]:=maxint;

83dijkstra;

84writeln(a[s]);

85end.

codevs 3731 尋找道路

題目描述 description 在有向圖g中,每條邊的長度均為1,現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件 1 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。2 在滿足條件1的情況下使路徑最短。注意 圖g中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符...

尋找道路(codevs 3731)題解

在有向圖 g 中,每條邊的長度均為 1,現給定起點和終點,請你在圖中找一條從起點到 終點的路徑,該路徑滿足以下條件 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。在滿足條件 1 的情況下使路徑最短。注意 圖 g 中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度。3 2...

ZCMU 1878 尋找道路 搜尋題

time limit 1 sec memory limit 128 mb submit 15 solved 10 submit status web board road.cpp c pas 問題描述 在有向圖g中,每條邊的長度均為1,現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足...