洛谷 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...