基礎演算法題 最短路計數(bfs遍歷)

2021-10-10 09:09:40 字數 2285 閱讀 9076

最短路計數

題目描述

給出乙個n個頂點m條邊的無向無權圖,頂點編號為 1-n 。問從頂點1開始,到其他每個點的最短路有幾條。

輸入格式

第一行包含2個正整數 n, m,為圖的頂點數與邊數。

接下來m行,每行2個正整數 x, y,表示有一條頂點x連向頂點y的邊,請注意可能有自環與重邊。

輸出格式

共 n 行,每行乙個非負整數,第ii行輸出從頂點 1 到頂點 i 有多少條不同的最短路,由於答案有可能會很大,你只需要輸出 ans mod 100003 後的結果即可。如果無法到達頂點 i 則輸出0。

輸入輸出樣例

輸入 #1

5 71 2

1 32 4

3 42 3

4 54 5

輸出 #111

124說明/提示

1到5的最短路有4條,分別為2條1-2-4-5和2條1-3-4-5

(由於4-5的邊有2條)。

對於20%的資料,n≤100;

對於60%的資料,n≤1000;

對於100%的資料,n<=1000000,m<=2000000。

這道題還沒有到做不出來的地步,那為什麼我比賽的時候我做不出來呢?我想還是思路沒理清(菜是原罪,哎)

解題思路

我們讀題後看能發現題目中所謂的城市 1 到某城市的長度其實就是最少要從城市 1 經過多少個城市到達某城市。當然這裡比較特殊需要考慮自環和重邊,但是計算方法是不變的。

難點:最短路徑與最短路徑數的關係

通過最短路徑的變化,確定最短路徑數的變化

從城市 1 開始進行廣度搜尋,將 1 加入佇列中。

情況一:【城市 1 到 y 城市的最短路徑】<【城市 1 到城市 x 的最短路徑 + 城市 x 到 y 城市的最短路徑】

操作:①、【城市 1 到 y 城市的最短路徑】 = 【城市 1 到城市 x 的最短路徑 + 城市 x 到 y 城市的最短路徑】

②、將【城市 1 到 y 城市的最短路徑數】 = 【城市 1 到城市 x 的最短路徑數】

③、將 y 城市放入佇列中。

情況二:【城市 1 到 y 城市的最短路徑】>【城市 1 到城市 x 的最短路徑 + 城市 x 到 y 城市的最短路徑】

不做任何操作

情況三:【城市 1 到 y 城市的最短路徑】=【城市 1 到城市 x 的最短路徑 + 城市 x 到 y 城市的最短路徑】

操作:①、【城市 1 到 y 城市的最短路徑數】 = 【城市 1 到城市 x 的最短路徑數 + 城市 1 到 y 城市的最短路徑數】

從上面我們可以看到,我們需要維護的陣列。

min_path 陣列:城市 i 到 城市 1 的最短路徑。

path 陣列:城市 i 到城市 1 的最短路徑數。

可能我表達的不是很清晰,**可能描述得更明確…

#include

using

namespace std;

vector <

int> u[

100010];

//紀錄關係

int min_path[

100010];

//每個城市的最短路徑

int path[

100010];

//每個城市最短路徑的條數

const

int mod =

100003

;struct nodenode, top;

void

bfs())

; min_path[1]

=1; path[1]

=0;while

(!q.

empty()

)else

if(top.c+

1== path[tmp]

)//有其他最短路徑

min_path[tmp]

=(min_path[tmp]

+min_path[top.city]

)%mod;}}

return;}

intmain()

for(

int i=

1; i<=n; i++

) path[i]

=100010

;memset

(min_path,0,

sizeof

(min_path));

bfs();

for(

int i=

1; i<=n; i++

)return0;

}

洛谷 1144 最短路計數 bfs

洛谷1144 最短路計數 傳送門 其實這道題目的正解應該是spfa裡面加一些處理,然而,然而,既然它是無權圖,那麼就直接bfs了,用乙個cnt記錄一下每乙個點的方案數,分幾種情況討論一下轉移,最後輸出cnt即為結果。題目中所說的重邊和自環啥的沒看出來有啥影響。1 include 2 include ...

演算法題 最短路徑 03 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...

洛谷P1144 最短路計數(BFS)

給出乙個n個頂點m條邊的無向無權圖,頂點編號為1 n。問從頂點1開始,到其他每個點的最短路有幾條。輸入第一行包含2個正整數n,m,為圖的頂點數與邊數。接下來m行,每行兩個正整數x,y,表示有一條頂點x連向頂點y的邊,請注意可能有自環與重邊。輸出包括n行,每行乙個非負整數,第i行輸出從頂點1到頂點i有...