BFS與反向BFS,鏈式前向星與反向建邊

2021-08-03 19:12:12 字數 1438 閱讀 8019

題目提供者該使用者不存在

標籤noip提高組

2014

雲端難度普及+/提高

時空限制1s / 128mb

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

#include#include#include#includeusing namespace std;

const int maxx=2000001;

const int big=10001;

int be[big][2],ne[maxx][2],to[maxx][2],e=0,ee=0;

int q[big*5],p[big],c[big],f,l;

void add(int x,int y)

void work(int x)

}int main()

scanf("%d%d",&a,&b);

f=l=0;

q[++l]=b;

p[b]=1;

while(f0)}}

if(k)break;

}if(!k)printf("-1");

return 0;

}made by羅旅洲

前向星和鏈式前向星

我們首先來看一下什麼是前向星.前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置和儲存長度,那麼前向星就構造好了.用len i 來記錄所有以i為起點的邊在陣列中的儲存長度.用head i 記...

前向星和鏈式前向星

前向星 前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置。鏈式前向星 鏈式前向星其實就是靜態建立的鄰接表,時間效率為o m 空間效率也為o m 遍歷效率也為o m next表示當前結點的下...

前向星和鏈式前向星

1 前向星 前向星是以儲存邊的方式來儲存圖,先將邊讀入並儲存在連續的陣列中,然後按照邊的起點進行排序,這樣陣列中起點相等的邊就能夠在陣列中進行連續訪問了。它的優點是實現簡單,容易理解,缺點是需要在所有邊都讀入完畢的情況下對所有邊進行一次排序,帶來了時間開銷,實用性也較差,只適合離線演算法。圖一 2 ...