題目描述
在有向圖 gg 中,每條邊的長度均為 11,現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件:
1 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。
2 在滿足條件 1的情況下使路徑最短。
注意:圖 gg 中可能存在重邊和自環,題目保證終點沒有出邊。
請你輸出符合條件的路徑的長度。
輸入格式
第一行有兩個用乙個空格隔開的整數 nn 和 mm,表示圖有 nn 個點和 mm 條邊。
接下來的 mm 行每行 22 個整數 x,yx,y,之間用乙個空格隔開,表示有一條邊從點 xx 指向點yy。
最後一行有兩個用乙個空格隔開的整數 s, ts,t,表示起點為 ss,終點為 tt。
輸出格式
輸出只有一行,包含乙個整數,表示滿足題目描述的最短路徑的長度。如果這樣的路徑不存在,輸出-1−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資料範圍
對於30%30%的資料,0 < n \le 100對於60%60%的資料,0 < n \le 1000對於100%100%的資料,0 < n \le 10000, 0 < m \le 200000,0 < x,y,s,t \le n, x,s \ne t0我們要求最短路,但是加了乙個前提條件:
路徑上的所有點的出邊所指向的點都直接或間接與終點連通。那麼我們就需要預處理一下,由於又是判斷兩個節點是否連通的問題。
總結判斷兩個節點是否聯通的方法:
1.使用並查集 (適合無向圖處理)
2.使用最短路
3.採用bfs和dfs預處理
由於本題要求的是有向圖,那麼我們就可以採用spfa建立乙個反向圖來判斷終點到各個點是否連通,這樣就可以省下一點時間了。然後我們在第二個spfa求起點到終點的最短路時判斷一下當前與這個點相連的點是否與終點相連即可。
**:
#include
#include
using
namespace std;
struct czp
a[200001
],b1[
200001];
int que[
20000001
],b[
100001
],dis[
100001
],h[
100001
],h1[
100001
],dis1[
100001];
int top,top1,m,n,sx,ex;
void
cun(
int from,
int to)
//鄰接表儲存
void
cun1
(int from,
int to)
//建立乙個反向圖用於判斷各點與終點是否連通
intpd
(int x)
//判斷與其相連的點是否與終點相連,即反向圖的最短路是否是初始化的最大值
return1;
}int
main()
scanf
("%d%d"
,&sx,
&ex)
;int head=
0,tail=1;
for(
int i=
1;i<=n;i++
) dis1[i]
=1e9
; dis1[ex]=0
; b[ex]=1
; que[1]
=ex;do}
k=b1[k]
.next;}}
while
(head;//第乙個spfa用於判斷各點是否與終點相連
head=
0,tail=1;
for(
int i=
1;i<=n;i++
) dis[i]
=1e9
,b[i]=0
; dis[sx]=0
; b[sx]=1
; que[1]
=sx;do}
k=a[k]
.next;}}
while
(head(dis[ex]
>=
1e9)
//特判: 如果起點與終點不連通
printf
("-1");
else
printf
("%d"
,dis[ex]);
return0;
}
洛谷P2296 尋找道路
在有向圖g 中,每條邊的長度均為1 現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件 1 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。2 在滿足條件1 的情況下使路徑最短。注意 圖g 中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度。輸入格式...
洛谷 P2296 尋找道路
題目描述 在有向圖g 中,每條邊的長度均為1 現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件 1 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。2 在滿足條件1 的情況下使路徑最短。注意 圖g 中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度...
洛谷 P2296 尋找道路
題目大意 在乙個有向圖中找出2點之間的最短路,並且路徑上的所有點的出邊所指向的點都直接或間接與終點連通。題解 spfa 佇列 dfs 1.從終點方向搜,把終點能到的點標記可到達。2.把終點能到達的點的出邊判斷,如果出邊未被標記則狀態更新為不可到達。3.做spfa,若t i 可以到達就做,不然不做。v...