最短路計數(SPFA Dijkstra )

2022-03-29 15:10:44 字數 1461 閱讀 6838

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

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

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

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

一道簡單題, 用spfa去更新最短路, 每次更新時, 即dis[y] > dis[x] + v, 點y的最短路條數就等於點x的最短路條數, 而當dis[y] = dis[x] + v時, 就說明該點產生了第二條最短路, 即點y最短路的條數加上點x最短路的條數。 即使當前不是最短路, 但是當更新到最短路時, 該最短路條數陣列會重置成此時點x的最短路條數, 所以這個演算法是正確的。

(補更~) 雖然spfa過了邊權為1的資料, 但今天機房某位大佬出了乙個邊權不為1的資料, 卡掉了spfa, 然後我就知道要用dijkstra演算法, 具體spfa演算法為什麼被卡我也不是很知道。

被卡資料如下 :

4 41 2 2

2 3 1

1 3 3

3 4 1

**已更新:

#include using

namespace

std;

typedef

long

long

ll;const

int inf = 0x3f3f3f3f

;const

int maxn = 2e6 + 100

;const

int maxm = 3e3 + 10

;template

< typename t > inline void read(t &x)

while

(isdigit(ch))

x *=ff;

}template

< typename t > inline void

write(t x)

intn, m;

intdis[maxn], vis[maxn], a[maxn];

int lin[maxn], tot = 0

;struct

edge e[maxn];

inline

void add(int xx, int yy, int

vv)

/*inline void spfa()

}else if(dis[y] == dis[x] + 1)

}}}*/

inline

void

dijkstra() }}

}int

main()

dijkstra();

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

return0;

}

最短路計數,次短路計數

acwing 1134.最短路計數 bfs 每個點只出隊一次,且入隊一次 dijkstra 每個點第一次出隊的序列一定滿足拓撲序 bellman ford spfa 出隊的時候都不一定是滿足最小,每個點可能出隊多次,有可能更新前面已經出隊的點,不具備拓撲序 但是要用 spfa 求最短路徑數,也是可以...

最短路計數

乙個無向圖上,沒有自環,所有邊的權值均為1,對於乙個點對 a,b 我們要把所有a與b之間所有最短路上的點的總個數輸出。總數 方程 if dis k map k,j dis j then inc dis k 所有最短路經過的點數之和 先求出floyd,然後 if dis i,k dis k,j dis...

最短路計數

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