求乙個無向無權圖的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行,每...