洛谷P1144 最短路計數 最短路

2022-09-03 05:15:05 字數 1350 閱讀 4095

求乙個無向無權圖的1號點到每個點最短路的個數。

一開始看到這道題真的蒙了。。。

現在看回來才發現十分簡單。其實就是乙個spfa的模板。但是為了「計數」,可以開乙個記錄答案的陣列sum

sum,那麼如果又找到一條從點1到點i

i最短路,就用sum

[i]s

um[i

]加上sum

[u]s

um[u

](uu表示從那個點到達點i

i)。因為可能會有多條道路到達點u

u,那麼也就有多條道路到達點ii。

如果找到一條比原來最短路還要短的路,那麼就更新一下sum

[i]s

um[i

]和dis

[i]d

is[i

]就行了。

初始化sum

[1]=

1sum

[1]=

1。其它搞乙個spfa就可以。

#include

#include

#define n 2000100

#define inf 1e9

#define mod 100003

using

namespace std;

int n,m,x,y,k,head[n]

,dis[n]

,vis[n]

,sum[n]

;struct edge

e[n]

;void

add(

int from,

int to)

//鄰接表存圖

void

spfa()

//十分模板(不過話說spfa我也沒有見過什麼變形,floyd倒是一大堆)

queue<

int> q;

q.push(1

);vis[1]

=1; dis[1]

=0;while

(q.size()

)}else

if(dis[v]

==dis[u]

+e[i]

.dis)

//又找到一條最短路

sum[v]

=(sum[v]

+sum[u]

)%mod;

//更新}}

}int

main()

sum[1]

=1;spfa()

;for

(int i=

1;i<=n;i++

)printf

("%d\n"

,sum[i]

%mod)

;return0;

}

洛谷P1144 最短路計數 最短路

求乙個無向無權圖的1號點到每個點最短路的個數。一開始看到這道題真的蒙了。現在看回來才發現十分簡單。其實就是乙個spfa的模板。但是為了 計數 可以開乙個記錄答案的陣列sum sumsu m,那麼如果又找到一條從點1到點i ii最短路,就用sum i sum i sum i 加上s um u sum ...

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

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

洛谷 P1144 最短路計數

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