洛谷 P2296 尋找道路

2022-04-04 21:28:27 字數 1804 閱讀 9615

在有向圖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正反存邊

反跑dfs標記終點能到達的點 也就是能到達終點的點

然後把出邊不能到達終點的點標記為不能走

然後正跑spfa

屠龍寶刀點選就送

#include #include 

#include

#define n 10005

using

namespace

std;

vector

g1[n],g2[n];

bool

cant[n],vis[n];

intn,m,s,t,dis[n];

void dfs(intx)}

intmain()

scanf(

"%d%d

",&s,&t);

dfs(t);

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

for(int j=0;jj)

}if(flag)

}for(int i=1;i<=n;++i) dis[i]=0x3f3f3f3f,vis[i]=0

; dis[s]=0;vis[s]=1

; queue

q;q.push(s);

for(int now;!q.empty();)}}

}dis[t]==0x3f3f3f3f?printf("

-1"):printf("%d"

,dis[t]);

return0;

}

洛谷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...