洛谷P2296 尋找道路

2021-07-22 23:25:35 字數 1965 閱讀 7393

在有向圖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 2

1 2

2 1

1 3

輸出樣例#1:

-1輸入樣例#2:

6 6

1 2

1 3

2 6

2 5

4 5

3 4

1 5

輸出樣例#2:

解釋1:

如上圖所示,箭頭表示有向道路,圓點表示城市。起點1 與終點3 不連通,所以滿足題

目᧿述的路徑不存在,故輸出- 1 。

解釋2:

如上圖所示,滿足條件的路徑為1 - >3- >4- >5。注意點2 不能在答案路徑中,因為點2連了一條邊到點6 ,而點6 不與終點5 連通。

對於30%的資料,0 < n≤10,0 < m≤20;

對於60%的資料,0 < n≤100,0 < m≤2000;

對於100%的資料,0 < n≤10,000,0 < m≤200,000,0 < x,y,s,t≤n,x≠t。

有腦bfs題。。(又是水題,只是來湊數的)

首先我們把所有的邊反過來,從終點開始bfs,你會神奇的發現所有不能到終點的全沒有標記。

之後把與不能通過的點相連的點標記刪掉。

最後開始bfs(蛤蛤,ac數又+了1)

#include

#include

#include

#include

#include

#include

using

namespace

std;

vector

a[10086],a1[10086];

queue

q;int tag[10086],s,t,n,m,vis[10086];//tag為標記陣列,只會走打標稽的點

int main()

scanf("%d%d",&s,&t);

memset(tag,0,sizeof(tag));

memset(vis,0,sizeof(vis));

tag[t]=1;

q.push(t);

while(!q.empty())}}

for(int i=1;i<=n;i++)}}

if(tag[s]!=1)

vis[s]=1;

while(!q.empty())q.pop();

q.push(s);

while(!q.empty())}}

if(vis[t]<=0)printf("-1");

else

printf("%d",vis[t]-1);

return

0;}

洛谷 P2296 尋找道路

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

洛谷 P2296 尋找道路

題目大意 在乙個有向圖中找出2點之間的最短路,並且路徑上的所有點的出邊所指向的點都直接或間接與終點連通。題解 spfa 佇列 dfs 1.從終點方向搜,把終點能到的點標記可到達。2.把終點能到達的點的出邊判斷,如果出邊未被標記則狀態更新為不可到達。3.做spfa,若t i 可以到達就做,不然不做。v...

洛谷 P2296 尋找道路

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