【問題描述】
在有向圖 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,否則就是求最短路了。
1type 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,現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足...