描述
在有向圖 g 中,每條邊的長度均為 1,現給定起點和終點,請你在圖中找一條從起點到 終點的路徑,該路徑滿足以下條件:
路徑上的所有點的出邊所指向的點都直接或間接與終點連通。
在滿足條件 1 的情況下使路徑最短。
注意:圖 g 中可能存在重邊和自環,題目保證終點沒有出邊。 請你輸出符合條件的路徑的長度。
輸入格式
第一行有兩個用乙個空格隔開的整數 n 和 m,表示圖有 n 個點和 m 條邊。
接下來的 m 行每行 2 個整數 x、y,之間用乙個空格隔開,表示有一條邊從點 x 指向點y。
最後一行有兩個用乙個空格隔開的整數 s、t,表示起點為 s,終點為 t。
輸出格式
輸出只有一行,包含乙個整數,表示滿足題目描述的最短路徑的長度。
如果這樣的路徑不存在,輸出-1。
input1
3 2
1 2
2 1
1 3
output1
-1input2
6 6
1 2
1 3
2 6
2 5
4 5
3 4
1 5
output2
3限制
對於 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。
【輸入輸出樣例1說明】
如上圖所示,箭頭表示有向道路,圓點表示城市。起點 1 與終點 3 不連通,所以滿足題目描述的路徑不存在,故輸出-1。
【輸入輸出樣例2說明】
如上圖所示,滿足條件的路徑為 1->3->4->5。注意點 2 不能在答案路徑中,因為點 2 連了一條邊到點 6,而點 6 不與終點 5 連通。
題目叫我們不能走最終到不了終點的點,所以我們就得想辦法把這些點標記出來,自然而然地可以想到,從終點開始廣搜,不在佇列裡的都是無法到達的。
然後從起點開始正著廣搜,如果當前節點的子節點有無法到達的,那麼當前點就不進行任何操作,否則就正常廣搜。
#include
#include
#include
#include
using
namespace
std;
int n,m,x,y,t,w,tot,tot,start,last;
int head[10005],to[400005],next[400005];
int head[10005],to[400005],next[400005];
int g[10005],dis[10005],p[10005],ok[10005];
void add(int x,int y)
void add(int x,int y)
int main()
for(int i=1;i<=m;i++)
cin>>start>>last;
t=0;w=1;
g[1]=last;
p[last]=1;
while(t1;
for(int i=head[x];i!=-1;i=next[i])
if(p[to[i]]==0)
}for(int i=1;i<=n;i++) p[i]=0;
t=0;w=1;
g[1]=start;
p[start]=1;
while(tif(x==last)
int can=ok[x];
for(int i=head[x];i!=-1;i=next[i])
if(p[to[i]]==0) can=(can&ok[to[i]]);
if(can>0) }}
cout
<
0;}
NOIP 2014 Day2T2 尋找道路
題目中文,不需要我說,直接講思路 題目要求找到一條從起點到終點的路徑,而且保證最短的前提下,每個點的出邊連線的點都要能到達終點,so 第一步,反向建圖,跑一遍bfs,確定能到達終點的所有點 第二步,減掉連著不能到達終點的點的點以及不能到達終點的點,用乙個隨便什麼陣列記錄能用的點就好了 第三步,正常的...
NOIP2014 day2 t2 尋找道路
尋找道路 noip2014 day2 t2 描述在有向圖 g 中,每條邊的長度均為 1,現給定起點和終點,請你在圖中找一條從起點到 終點的路徑,該路徑滿足以下條件 1 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。2 在滿足條件 1 的情況下使路徑最短。注意 圖 g 中可能存在重邊和自環,題...
NOIP2014 尋找道路
題目描述 在有向圖g中,每條邊的長度均為1,現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件 1 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。2 在滿足條件1的情況下使路徑最短。注意 圖g中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度。輸入...