NOIP2014 day2 t2 尋找道路

2022-04-30 14:21:08 字數 1195 閱讀 3570

尋找道路

noip2014 day2 t2

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

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

中可能存在重邊和自環,題目保證終點沒有出邊。 請你輸出符合條件的路徑的長度。

輸入格式

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

x、y,之間用乙個空格隔開,表示有一條邊從點 x 指向點 y。 最後一行有兩個用乙個空格隔開的整數 s、t,表示起點為 s,終點為 t。

輸出格式

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

備註輸入樣例1

3 2 1 2 2 1 1 3

輸出樣例1

-1輸入樣例2

6 6 1 2 1 3 2 6 2 5 4 5 3 4 1 5

輸出樣例2

資料說明 對於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。

思路:

先建反圖 從終點dfs判斷能否到達。

再連邊從正向bfs搜到終點就可以啦。

// by siriusren

#include

#include

#include

using

namespace

std;

queue

q;int n,m,from[400500],to[400500],tot=0,vis[20050],s,e,v[20050];

int v[400500],first[20050],next[400050];

void add(int x,int y)

void dfs(int x)

bool check(int x)

int main()}}

puts("-1");

}

NOIP 2014 Day2T2 尋找道路

題目中文,不需要我說,直接講思路 題目要求找到一條從起點到終點的路徑,而且保證最短的前提下,每個點的出邊連線的點都要能到達終點,so 第一步,反向建圖,跑一遍bfs,確定能到達終點的所有點 第二步,減掉連著不能到達終點的點的點以及不能到達終點的點,用乙個隨便什麼陣列記錄能用的點就好了 第三步,正常的...

NOIP2014 Day1 T2 聯合權值

noip2014 day1 t2 聯合權值 time limit 10000ms memory limit 131072k total submit 57 accepted 30 case time limit 1000ms description input output sample input...

NOIP 2014 day 1 T2 聯合權值

第一眼看起來很複雜。所以我想了個對鏈 和樹不同情況都分別處理的演算法。orz。複雜度太高最後4組t了。所以。轉換思路。聯合權值 w i w j i,j距離為2.也就是i,j中間間隔了乙個節點,所以我們在遍歷這個中間節點的時候處理。題目求最大和總和,先考慮最大,我們只需要對節點u維護乙個 max1,m...