codevs 3731 尋找道路

2021-08-03 14:31:50 字數 1147 閱讀 2861

題目描述 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 中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度。輸入格式...