求乙個無向無權圖的1號點到每個點最短路的個數。
一開始看到這道題真的蒙了。。。
現在看回來才發現十分簡單。其實就是乙個spfa的模板。但是為了「計數」,可以開乙個記錄答案的陣列sum
sumsu
m,那麼如果又找到一條從點1到點i
ii最短路,就用sum
[i
]sum[i]
sum[i]
加上s um
[u
]sum[u]
sum[u]
(u
uu表示從那個點到達點i
ii)。因為可能會有多條道路到達點u
uu,那麼也就有多條道路到達點iii。
如果找到一條比原來最短路還要短的路,那麼就更新一下sum
[i
]sum[i]
sum[i]
和d is
[i
]dis[i]
dis[i]
就行了。
初始化sum
[1]=
1sum[1]=1
sum[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 sum,那麼如果又找到一條從點1到點i i最短路,就用sum i s um i 加上sum u s um u uu表示從那個點...
洛谷 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行,每...