noip尋找道路

2022-02-13 13:22:26 字數 2205 閱讀 4817

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

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

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

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

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

輸入格式:

輸入檔名為road .in。

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

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

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

輸出格式:

輸出檔名為road .out 。

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

3
解釋1:

如上圖所示,箭頭表示有向道路,圓點表示城市。起點1 與終點3 不連通,所以滿足題

目᧿述的路徑不存在,故輸出- 1 。

解釋2:

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

對於30%的資料,0對於60%的資料,0對於100%的資料,0【解析】

跑兩邊bfs。

因為要求從走的這個點相連的點能到達終點,那麼也能從終點走到那個點。

所以我們在存邊的時候順便存乙個反圖。就是原來的道路的方向都是反的。

那樣我們從終點開始bfs,能夠進入佇列中的點都標上標記,表示在反圖終點可以到達,那麼在正圖中,這些點也可以到達終點。

但是還有乙個條件,與能到達終點的點相連的點也必須能到達終點。

這樣。我們從起點開始,如果掃到的這個點是在之前bfs中做過標記的,說明這個點可以到達終點。我們再掃一下和這個點相連的點是否能到達終點,

如果存在乙個點不能到達終點,這麼當前這個做了標記的點不能走了。

之前的兩個處理,我們已經把能走的點做好了標記,那麼我們從起點開始一邊bfs,記錄路徑長度選擇最優就可以了。

【**】

//

尋找道路

##include

#include

#include

using

namespace

std;

#define n 10009typedef pair

pii;

vector

zmap[n],fmap[n];

queue

que;

queue

int,int> >quue;

bool

can[n],go[n],done[n];

intn,m,x,y,st,ed,flag;

void bfs(int

x) }

que.pop();

}}void

slove()

}if(flag)continue

;

else

go[i]=1

; }

}void

bfs1()

if(go[t]&&!done[t])

}quue.pop();

}}int

main()

scanf(

"%d%d

",&st,&ed);

bfs(ed);

slove();

if(!go[st])

bfs1();

return0;

}

NOIP2014 尋找道路

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

noip2014 尋找道路

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

NOIP2014 尋找道路

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