洛谷 P1144 最短路計數 題解

2022-05-01 04:06:08 字數 1599 閱讀 2668

給出乙個\(n\)個頂點\(m\)條邊的無向無權圖,頂點編號為\(1-n\)。問從頂點\(1\)開始,到其他每個點的最短路有幾條。

第一行包含\(2\)個正整數\(n,m\),為圖的頂點數與邊數。

接下來\(m\)行,每行\(2\)個正整數\(x,y\),表示有一條頂點\(x\)連向頂點\(y\)的邊,請注意可能有自環與重邊。

共nn行,每行乙個非負整數,第ii行輸出從頂點11到頂點ii有多少條不同的最短路,由於答案有可能會很大,你只需要輸出\(ans \bmod 100003\)後的結果即可。如果無法到達頂點\(i\)則輸出\(0\)。

輸入 #1

5 71 2

1 32 4

3 42 3

4 54 5

輸出 #111

124\(1\)到\(5\)的最短路有\(4\)條,分別為\(2\)條\(1-2-4-5\)和\(2\)條\(1-3-4-5\)(由於\(4-5\)的邊有\(2\)條)。

對於\(20\%\)的資料,\(n ≤ 100\);

對於\(60\%\)的資料,\(n ≤ 1000\);

對於\(100\%\)的資料,\(n<=1000000,m<=2000000\)。

最短路 , dijkstra

從1到每乙個點的最短路有多少條

最短路有多少條?

完全可以在dijkstra或者spfa的過程中求出來的

因為在鬆弛操作的時候

用y到x的邊去鬆弛

如果這條邊替換上去會使1到x的距離更近

那這個時候x的答案就會變為鬆到他y的最短路的個數

如果這條邊替換上去和原來一樣

那就是目前看來可以當做最短路

在x原來最短路個數的基礎上加上到點y最短路的個數就可以了

#include#include#include#includeusing namespace std;

int read()

while(c >= '0' && c <= '9')

return sum * fg;

}const int max = 2000006;

const int mo = 100003;

struct node

a[max << 1];

int head[max >> 1],sum = 0;

void add(int x,int y)

struct point

};int dis[max >> 1];

priority_queueq;

int ans[max >> 1];

bool use[max >> 1];

void dj()

); while(!q.empty())

); }

else

if(dis[awa] == dis[x] + 1)

} }}

int main()

dj();

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

cout << ans[i] << endl;

return 0;

}

洛谷P1144最短路計數題解

此題還是尋找從1到i點總共有幾個最短路且每條邊的邊長為1,對於這種尋找最短路的個數,我們可以反向搜尋,即先用 spfa 預處理出所有點的最短路,然後我們反向記憶化搜尋,可以用 sum i 表示從i到1的最短路個數,然後我們初始化 sum 1 1 然後就可以了 include include incl...

洛谷P1144 題解 最短路計數

這道題可以用各種演算法踩掉,我選擇的是spfa。因為題目要求計數,所以我們開乙個ans陣列表示數量。分兩種情況討論 一 dis v dis u 1 最短路被更新了,可以直接ans v ans u覆蓋。二 dis v dis u 1 又找到一條最短路,將條數相加即可。具體看 include defin...

題解 洛谷P1144 最短路計數

題面 我們考慮在每一次 dijkstra 演算法時,記錄一下從 1 sim i 最短路徑的條數。具體地說,我們在每一次遍歷節點時 注意判等於要放在判大於之前。include using namespace std const int n 1000003,m 4000003,mod 100003 in...