NOIP2014 尋找道路

2021-09-03 03:34:54 字數 1634 閱讀 8972

【題目描述】

在有向圖g中,每條邊的長度均為1,現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件:

1.路徑上的所有點的出邊所指向的點都直接或間接與終點連通。 2.在滿足條件1的情況下使路徑最短。

注意:圖g中可能存在重邊和自環,題目保證終點沒有出邊。

請你輸出符合條件的路徑的長度。

輸入

第一行有兩個用乙個空格隔開的整數n和m,表示圖有n個點和m條邊。接下來的m行每行2個整數x、y,之間用乙個空格隔開,表示有一條邊從點x指向點y。

最後一行有兩個用乙個空格隔開的整數s、t,表示起點為s,終點為t。

輸出

輸出只有一行,包含乙個整數,表示滿足題目描述的最短路徑的長度。如果這樣的路徑不存在,輸出- 1。

樣例輸入

6 61 2

1 32 6

2 54 5

3 41 5

樣例輸出

3其實從某種意義上來說,這道題很簡單。

這道題難點在於判斷路徑上的點的出邊上的點是否直接或間接和終點相連。每個點判斷一次,顯然時間複雜度承受不了(當然,卡常出奇蹟 ) 。而這道題似乎也不大可能直接找到從每個點開始快速判斷出邊上的點是否和終點相連的方法。那麼,正難則反。如果我們反向加邊,從終點開始做一次深搜,就能輕易判斷哪些點是終點無法到達的。這樣再列舉這些點在反向圖中的出邊指向的點,標記為不能走的點,剩下的就是乙個最短路模板題了。所以這道題就是乙個模板題。

**:

#include

#include

#include

#include

#include

#include

#include

#define re register

using

namespace std;

int n,m,a,b;

struct nodee[

2000001];

bool vis[

10001];

int f[

10001];

int nxp[

2000001];

int cnt=

0,st,ed;

inline

void

add(

int u,

int v)

void

dfs(

int u)}}

bool bad[

10001];

int dis[

10001];

void

spfa()

}}}}

intmain()

scanf

("%d%d"

,&st,

&ed)

;dfs

(ed)

;for

(int re i=

1;i<=n;i++)}

}spfa()

;if(dis[st]

<

1e7)

cout<;else cout<<

"-1"

;}

noip2014 尋找道路

題目提供者該使用者不存在 標籤圖論2014noip提高組 難度普及 提高 提交該題 討論 題解記錄 在有向圖g 中,每條邊的長度均為1 現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件 1 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。2 在滿足條件1 的情況下使路徑...

NOIP2014 尋找道路

傳送門 這道題還是比較簡單的。我們只要先用老套路建出反圖,記錄終點與哪些點是聯通的,之後從所有不與終點聯通的點出發,在反圖上列舉一下與之直接相連的邊,也設為不能走。之後我們在可以走的路上跑最短路即可。看一下 include include include include include includ...

NOIP2014 尋找道路

一張有向圖 長度均為1 輸入格式為x y 表示x和y之間有一條路 給定s和t 求s到t的最短路 要求 路徑上的所有點的出邊所指向的點都直接或間接與終點連通 在這裡點包括3種 1 自己指向的節點都可以到達終點 2 自己可以到達終點的點 3 普通的點 顯然 3包括2 2包括1 這裡要的是由1組成的最短路...