P1144 最短路計數 題解 最短路應用題

2022-05-24 08:24:13 字數 759 閱讀 6802

其實這道題目是最短路的變形題,因為資料範圍 \(n \le 10^6, m \le 2 \times 10^6\) ,所以直接用dijkstra演算法是不行的,可以使用 dijkstra+堆優化 或者 spfa演算法來實現。

我這裡使用 spfa演算法 來實現 (不會dijkstra堆優化囧)

這道題目因為需要計數,所以需要在dist陣列基礎上再開乙個cnt陣列,其含義如下:

然後佇列擴充套件的時候:

這樣就可以實現最短路計數(dijkstra同理)。

實現**如下:

#include using namespace std;

const int maxn = 1000010;

const long long inf = (1ll<<60);

const long long mod = 100003ll;

vectorg[maxn];

queueque;

int n, m, x, y;

long long dist[maxn], cnt[maxn];

bool inq[maxn];

void spfa()

else

if (!inq[v]) }}

}}int main()

spfa();

for (int i = 1; i <= n; i ++)

printf("%lld\n", cnt[i]);

return 0;

}

P1144 最短路計數 題解

同步 原題鏈結 簡要題意 求從源點開始向各點出發,最短路的個數。注意到 出題人很善良 資料範圍很強,所以我們採用 spfa text spfa 在這之前如果你不懂最短路,請務必 左轉弱化模板 或學習 最短路模板 ok texttt ok,現在所有人都會了 spfa text spfa 這個演算法。為...

題解 P1144 最短路計數

這道題用一次spfa就可以過了。在求最短路的同時,對答案進行統計即可。實現 dis i 表示從1到 i 的最短路 實在還是不懂的話看程式吧 當 dis i dis j 1 時,直接令 ans i ans j 即可。當 dis i dis j 1 時,那麼到 i 的路徑就可以多加上 j 的路徑,即 a...

P1144 最短路計數

給出乙個nn個頂點mm條邊的無向無權圖,頂點編號為1 n1 n。問從頂點11開始,到其他每個點的最短路有幾條。輸入格式 第一行包含22個正整數n,mn,m,為圖的頂點數與邊數。接下來mm行,每行22個正整數x,yx,y,表示有一條頂點xx連向頂點yy的邊,請注意可能有自環與重邊。輸出格式 共nn行,...