題解 Luogu P1608 路徑統計

2021-09-27 02:29:40 字數 1032 閱讀 5086

有一張 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 ...