有一張 n (n <= 2000) 個點 m (m <= n*(n-1)/2) 條邊的有向圖,每個邊的邊權為 c (c<=10) 。請求出從 1 到 n 的最短路以及最短路的條數。
spfa / dij
直接用 spfa 或者 dij 求最短路(本題解採用 spfa),在求最短路的時候多統計乙個陣列 cnt[i] 表示從 1 到 i 的最短路有幾條。
初始化 cnt[1] = 1,每次更新多增加一下操作:
如果 dis[x]+w[i] == dis[e[i]],那麼 cnt[e[i]] += cnt[x];
如果 dis[x]+w[i] < dis[e[i],那麼 dis[e[i]] = dis[x]+w[i], cnt[e[i]] = cnt[x];
並且每次更新完乙個點之後,需要把當前點的 cnt[i] 清零,否則會重複計算。
#include
using
namespace std;
const
int mn =
2000+10
;const
int inf =
0x3f3f3f3f
;int n, m, dis[mn]
, cnt[mn]
, f[mn]
;int t[mn]
[mn]
;int
spfa()
if(cnt[i]
&&!f[i]
) f[i]=1
, q.
push
(i);
} cnt[x]=0
;}return dis[n];}
intmain()
if(spfa()
==inf)
puts
("no answer");
else
printf
("%d %d"
, dis[n]
, cnt[n]);
return0;
}
luogu P1608 路徑統計
rp餐廳 的員工素質就是不一般,在齊刷刷的算出同乙個 號碼之後,就準備讓hzh,tzy去送快餐了,他們將自己居住的城市畫了一張地圖,已知在他們的地圖上,有n個地方,而且他們目前處在標註為 1 的小鎮上,而送餐的地點在標註為 n 的小鎮。有點廢話 除此之外還知道這些道路都是單向的,從小鎮i到j需要花費...
Luogu P1608 路徑統計 最短路計數
頹了 重邊導致我乖乖用鄰接矩陣。好吧就是個最短路計數。如果更新時d v d u w i 就可以接起來,把兩個加在一起。如果d v d u w i 那麼c v 直接賦值為c u 相當於這個最短路是由u轉移過來的 include include include include define r regi...
P1608 路徑統計
aimee 很水的題目 只要把p1144改一下 需要注意的是這個題有重邊,求方案數的話一定要去重!這就涉及到很有趣的問題。要想成為頂尖高手 就要做到滴水不漏 橙汁哥 從這個題我才知道我寫的堆優化dijkstra複雜度有問題 tle起飛 include include include include ...