洛谷 P2296 尋找道路

2021-08-09 07:48:48 字數 1376 閱讀 7462

題目描述

在有向圖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

題解:一開始寫了個拓撲排序跪了,想一想還是很有道理的。反向建圖,對於入度為0,刪掉改點,並將改點所連得點標記,只能標記不能刪除(就是這跪了),但若刪掉改點後其連線的點入度為0,繼續刪,這就是拓撲排序的思想。然後bfs,被標記的點不能走。

總結:對於圖論題中要對圖的結構進行調整時一定要考慮影響,如果有反面影響,一定不能改。

#include #include #include #include #include #define n 300000

#define inf (1<<28)

using namespace std;

queueq;

int n,m,dis[n],rd[n];

int last[n],to[n],head[n],cnt=0;

bool vis[n];

void ins(int u,int v)

int main()

scanf("%d%d",&s,&t);

for(int i=1;i<=n;i++)

while(!q.empty())

}q.push(t);dis[t]=0;

while(!q.empty())

for(int i=head[tmp];i;i=last[i]){

if(vis[to[i]] || dis[to[i]]

洛谷P2296 尋找道路

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

洛谷 P2296 尋找道路

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

洛谷 P2296 尋找道路

題目大意 在乙個有向圖中找出2點之間的最短路,並且路徑上的所有點的出邊所指向的點都直接或間接與終點連通。題解 spfa 佇列 dfs 1.從終點方向搜,把終點能到的點標記可到達。2.把終點能到達的點的出邊判斷,如果出邊未被標記則狀態更新為不可到達。3.做spfa,若t i 可以到達就做,不然不做。v...