NOIP2014提高組 尋找道路

2021-08-28 03:42:49 字數 1826 閱讀 2556

noip2014 提高組 day2 試題。

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

1.路徑上的所有點的出邊所指向的點都直接或間接與終點連通。 

2.在滿足條件 1 的情況下使路徑最短。 

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

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

第一行有兩個用乙個空格隔開的整數 n 和 m,表示圖有 n 個點和 m 條邊。 

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

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

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

輸入

3 2 

1 2 

2 1 

1 3

輸出

-1
輸入

6 6 

1 2 

1 3 

2 6 

2 5 

4 5 

3 4 

1 5

輸出

3
【樣例1說明】

如上圖所示,箭頭表示有向道路,圓點表示城市。起點 1 與終點 3 不連通,所以滿足題目描述的路徑不存在,故輸出 -1。

【樣例2說明】

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

【資料說明】 

對於 30% 的資料,0解析:

題解是bfs,而我用的是另一種方法。

如果沒有限制一,那麼就是一道最短路的板題,其實對於限制一,我們只需要將與出度為0且不是終點的點相連的點標記不能走,然後直接最短路,就可以了。為什麼是對的?稍微畫圖想想你就明白了。

**:

#include using namespace std;

const int maxn=10005;

const int maxm=200005;

const int inf=1e9;

int n,m,size,s,t;

int first[maxn],first[maxn],v[maxn],pre[maxn],dis[maxn],to[maxn],vis[maxn];

struct shu;

shu edge[maxm<<1],edge[maxm<<1];

inline int get_int()

inline void build(int x,int y)

inline void dfs(int point)

}inline void dijkstra()

} }}

int main()

s=get_int(),t=get_int();

for(int i=1;i<=n;i++) if(!to[i] && i!=t) dfs(i);

dijkstra();

if(dis[t]==inf) cout<

else cout<

return 0;

}

NOIP2014 尋找道路

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

noip2014 尋找道路

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

NOIP2014 尋找道路

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