洛谷P1144 最短路計數

2022-05-01 18:57:10 字數 1360 閱讀 7524

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

標籤圖論

難度普及+/提高

提交該題 討論 題解 記錄

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

輸入格式:

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

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

輸出格式:

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

輸入樣例#1:

5 7

1 21 3

2 43 4

2 34 5

4 5

輸出樣例#1:

111

24

1到5的最短路有4條,分別為2條1-2-4-5和2條1-3-4-5(由於4-5的邊有2條)。

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

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

對於100%的資料,n ≤ 100000,m ≤ 200000。

分析:這道題有乙個陷阱:告訴你一條邊是u連向v,很容易認為是有向邊,其實是無向邊......既然是無向邊,邊權為1,那麼就bfs一下.如果求到達點u的最短路的個數呢?設現在求到的最短路為v,如果從1到i到u的距離正好為v,那麼點u的個數則應該加上點i的個數,同時要注意取模.

#include #include 

#include

#include

#include

using

namespace

std;

const

int maxn = 1000010,mod = 100003

;int head[maxn], to[maxn * 2], nextt[maxn * 2

],tot,vis[maxn],d[maxn];

intn, m, cnt[maxn];

void add(int a, int

b)void

bfs()

else

if (d[v] == d[u] + 1

) cnt[v] = (cnt[u] + cnt[v]) %mod;}}

}int

main()

bfs();

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

printf(

"%d\n

", cnt[i]);

return0;

}

洛谷 P1144 最短路計數

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

洛谷 P1144 最短路計數

給出乙個nn個頂點mm條邊的無向無權圖,頂點編號為1 n1 n。問從頂點11開始,到其他每個點的最短路有幾條。輸入格式 第一行包含22個正整數n,mn,m,為圖的頂點數與邊數。接下來mm行,每行22個正整數x,yx,y,表示有一條頂點xx連向頂點yy的邊,請注意可能有自環與重邊。輸出格式 共nn行,...

洛谷 P1144 最短路計數

給出乙個nn個頂點mm條邊的無向無權圖,頂點編號為1 n1 n。問從頂點11開始,到其他每個點的最短路有幾條。第一行包含22個正整數n,mn,m,為圖的頂點數與邊數。接下來mm行,每行22個正整數x,yx,y,表示有一條頂點xx連向頂點yy的邊,請注意可能有自環與重邊。共nn行,每行乙個非負整數,第...