P2296 尋找道路

2021-08-07 04:41:30 字數 1942 閱讀 9290

洛谷 p2296

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

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

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

注意:圖g 中可能存在重邊和自環,題目保證終點沒有出邊。

請你輸出符合條件的路徑的長度。

####輸入輸出格式

輸入格式:

輸入檔名為road .in。

第一行有兩個用乙個空格隔開的整數n 和m ,表示圖有n 個點和m 條邊。

接下來的m 行每行2 個整數x 、y ,之間用乙個空格隔開,表示有一條邊從點x 指向點y 。

最後一行有兩個用乙個空格隔開的整數s 、t ,表示起點為s ,終點為t 。

輸出格式:

輸出檔名為road .out 。

輸出只有一行,包含乙個整數,表示滿足題目᧿述的最短路徑的長度。如果這樣的路徑不存在,輸出- 1 。

輸入輸出樣例

輸入樣例#1:

3 21 2

2 11 3

輸出樣例#1:

-1輸入樣例#2:

6 61 2

1 32 6

2 54 5

3 41 5

輸出樣例#2:

3這道題是noip2014提高組的一道題,本題的做法是先把每條邊正向存一遍,並且記錄每條邊的出度,然後再把邊反向存一遍,從終點t開始做一遍dfs,把每個點的入讀存下來,再和之前所存下的出度對比一下,如果相同則說明可以到達終點t,不想同則不能到達,並且標記一下,最後跑一遍最短路即可。

#include

#include

#include

#include

#include

#include

using

namespace std;

struct arrbot1[

500000

],bot2[

500000];

int head1[

20000

],head2[

20000

],ru[

20000

],chu[

20000

],f[

20000

],dis[

20000

],ff[

20000];

int n,m,cnt1,cnt2,s,t;

deque<

int>q;

inline

void

add1

(int u,

int v,

int w)

//鄰接鍊錶存邊

inline

void

add2

(int u,

int v,

int w)

void

dfs2

(int u)

}inline

void

spfa

(int s)}}

}}inline

intread()

intmain()

s=read()

;t=read()

;dfs2

(t);

for(

int i=

1;i<=n;i++)if

(ru[i]

!=chu[i]

) f[i]=1

;//標記一下,在做spfa的時候如果的是1,就不將這個點加入到spfa中

spfa

(s);

if(dis[t]

==0x3f3f3f3f

)cout<<-1

;else

printf

("%d"

,dis[t]);

}

P2296 尋找道路

反著建圖,從點 include include include define ri register int using namespace std const int maxn 200020,inf 1310668019 int n,m,s,t,u maxn v maxn w maxn fst m...

P2296 尋找道路

洛谷鏈結 這個題是14年day2的第二題,也只有普及 提高的難度。題目大意就是在一堆滿足所有後繼連線的點都可以到達終點的點中,找到最短路徑。思路就是先一邊dfs,求出滿足條件1的點,之後spfa就好了,其實用bfs會更快一點。1 include2 include3 define n 10010 4 ...

P2296 尋找道路

題目鏈結啦啦啦 首先將邊反向建立,然後bfs求出答案 1 include2 using namespace std 3int read 47 while c 0 c 9 8return x y 9 10int n,m 11 vectorv 10005 12 bool cando 10005 er 1...