題目描述 description
在有向圖g中,每條邊的長度均為1,現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件:
1.路徑上的所有點的出邊所指向的點都直接或間接與終點連通。
2.在滿足條件1的情況下使路徑最短。
注意:圖g中可能存在重邊和自環,題目保證終點沒有出邊。
請你輸出符合條件的路徑的長度。
輸入描述 input description
第一行有兩個用乙個空格隔開的整數n和m,表示圖有n個點和m條邊。
接下來的m行每行2個整數x、y,之間用乙個空格隔開,表示有一條邊從點x指向點y。
最後一行有兩個用乙個空格隔開的整數s、t,表示起點為s,終點為t。
輸出描述 output description
輸出檔名為road.out。
輸出只有一行,包含乙個整數,表示滿足題目
描述的最短路徑的長度。如果這樣的路徑不存在,輸出-1。
建反邊真是乙個好強大的技能。
首先,我們可以反向進行建邊,以終點為起點bfs出每一條邊的連通性,將反向能夠連過的邊的vis記為1。
接著,以起點為起點正著進行bfs,在新增now連線新的邊i 進入佇列之中需滿足now連的所有邊vis都不為0,即沒有邊與終點不連通,這樣即可保證所有點的出邊所指向的點都直接或間接與終點連通。注意一定要將重點的vis改為乙個不為1的數,否則無法搜尋到終點。
下附ac**。
#include#include#include#include#include#define maxn 10005
using namespace std;
int vis[maxn];
int n,m;
int f,t;
vectorzb[maxn];
vectorfb[maxn];
int cnt=0;
struct nod
nod(){}
};queueq;
queuerq;
int num[maxn];
int dis[maxn];
void jianfanbian()
cin>>f>>t;
jianfanbian();
qiuzhengjie();
cout<<-1<
尋找道路(codevs 3731)題解
問題描述 在有向圖 g 中,每條邊的長度均為 1,現給定起點和終點,請你在圖中找一條從起點到 終點的路徑,該路徑滿足以下條件 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。在滿足條件 1 的情況下使路徑最短。注意 圖 g 中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長...
尋找道路(codevs 3731)題解
在有向圖 g 中,每條邊的長度均為 1,現給定起點和終點,請你在圖中找一條從起點到 終點的路徑,該路徑滿足以下條件 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。在滿足條件 1 的情況下使路徑最短。注意 圖 g 中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度。3 2...
codevs3731 luogu2296 尋找道路
在有向圖g 中,每條邊的長度均為1 現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件 1 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。2 在滿足條件1 的情況下使路徑最短。注意 圖g 中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度。輸入格式...