洛谷最短路計數SPFA

2021-08-07 02:33:23 字數 1466 閱讀 2086

給出乙個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<=1000000,m<=2000000。

分析:spfa,進行spfa時順便數一下有幾條最短路,每一次更新時,說明以前記錄的都不是最短路,ans 更新成到達他的點的ans,相等時加上到他的點的ans。注意要取模

//

gang

#include#include

#include

#include

#include

#include

#include

#define for(x,y,z) for(int x=y;x<=z;x++)

#define rep(x,y,z) for(int x=y;x>=z;x--)

#define ll long long

using

namespace

std;

const

int mod=100003

;int

n,m;

intx,y;

int hd[2000005

];bool book[2000005

];int dis[2000005

];int ans[2000005

];int

cnt;

struct

nodee[

2000005

];void add(int u,int v,int

dis)

void

spfa()

ans[v]=ans[u];

}else

if(dis[v]==dis[u]+e[i].dis)}}

}int

main()

spfa();

for(i,

1,n)

printf(

"%d\n

",ans[i]);

return0;

}

洛谷 P1144 最短路計數(最短路 SPFA)

傳送門 資料範圍看起來好像很嚇人,但我還是水過去了嘻嘻 先跑一遍spfa確定最短路長度,然後用記憶化搜尋累加答案 點1到點1的答案為1,然後遞迴搜尋,如果下乙個點在最短路徑上,我就把我的答案加上它的答案 code include include include struct nodea 400001...

洛谷 P1144 最短路計數 SPFA

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

最短路計數 spfa

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