最短路計數
題目描述
給出乙個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有...