對最短路的計數操作

2022-05-20 01:12:45 字數 1050 閱讀 3498

一般來說,絕大多數單源最短路都是可計數的,以下提供堆迪傑和spfa的基本思路和spfa的模板(因為只寫了spfa的)。

dij的基本思路基於貪心,其流程為:

找到當前確定的最短路(她是當前所有點的可能最短路中最小的)

用她更新其他點,使更新後最短路更小(if(dis[j]>dis[i]+d[i][j])dis[j]=dis[i]+d[i][j])

跳到1;

於是在2的同時記錄最短路是當前值時的個數;

spfa的基本思路類似於廣搜,流程如下:

從記錄被更新後沒更新其他點的佇列a中選取點;

用她更新其他點,使更新後最短路更小,並把不在a中的記錄;

跳到1;

同樣在2的同時記錄最短路是當前值時的個數;

spfa的最短路計數模板如下

#include#include

using

namespace

std;

struct

ssx[

400001

];int first[100001

],num;

int dis[100001],f[100001

];int dl[1000001],h,t,vis[100001

];void build(int f,int

t)int

main()

memset(dis,

0x3f3f3f,sizeof

(dis));

h=0;t=1;dl[t]=1;dis[1]=0;f[1]=1

;

while(hif(dis[x[j].to]>dis[dl[h]]+1

)

if(dis[x[j].to]==dis[dl[h]]+1&&vis[x[j].to]==0

)

j=x[j].next;}}

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

printf(

"%d\n

",f[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的邊,請注意可能有自環與重...