最短路計數,次短路計數

2022-09-11 01:03:26 字數 2824 閱讀 3860

acwing 1134.最短路計數

①$bfs$ 每個點只出隊一次,且入隊一次

②$dijkstra$ 每個點第一次出隊的序列一定滿足拓撲序

③$bellman-ford(spfa)$ 出隊的時候都不一定是滿足最小,每個點可能出隊多次,有可能更新前面已經出隊的點,不具備拓撲序

但是要用$spfa$求最短路徑數,也是可以的。比如當邊權有負數時,就只能用$spfa$,先用$spfa$跑一遍,將每個點的最短路徑跑出,然後建立最短路徑樹,在樹上進行$dp$(拓撲排序)。

當$dis[j] > dis[t] + 1$時,轉移,並將$cnt[t]$的值賦給$cnt[j]$, 當$dis[j] = dis[t] + 1$時,累加,將$cnt[j] = (cnt[j] + cnt[t])$。

1 #include 2 #include 3 #include 4 #include 5

6using

namespace

std;78

const

int mod = 100003;9

10const

int n = 1e5 + 10, m = 4e5 + 10;11

inte[m], ne[m], h[n], idx;

12int

dis[n];

13bool

st[n];

14int

cnt[n];

15int

n, m;

1617

void add(int a, int

b)18

2122

void

bfs()

2344

else

if(dis[j] == dis[t] + 1)45

48}49}

50}5152

intmain()

6263

bfs();

6465

for(int i = 1 ; i <= n ; i ++)cout << cnt[i] <

66return0;

67 }

acwing 383.觀光

在求最短路數的基礎上進行求次短路數。和在樹中求最大直徑和次大直徑的方法一樣。在最短路數的基礎上:

如果當前小於最短路,先更新次短路數,加入堆,再更新最短路數,加入堆;

再如果當前等於最短路,累加最短路數;

再如果當前小於次短路,更新次短路數,加入堆;

最後如果當前等於次短路數,累加次短路數。

次短路數和最短路數一樣,都是滿足拓撲序的,所以使用$dijkstra$演算法求解。

1 #include 2 #include 3 #include 4 #include 5 #include 6

7using

namespace

std;89

const

int n = 1010, m = 20010;10

11struct

node

16};

1718

inte[m], ne[m], w[m], h[n], idx;

19int dis[n][2], cnt[n][2

];20

bool st[n][2

];21

intn, m;

22int

s, e;

2324

void add(int a, int b, int

c)25

2829

intdijkstra()

30);

3839

while

(heap.size())

40);

55 dis[j][0] = distance + w[i], cnt[j][0] =count;

56 heap.push();57}

58else

if(dis[j][0] == distance + w[i])cnt[j][0] +=count;

59else

if(dis[j][1] > distance +w[i])

60);63}

64else

if(dis[j][1] == distance + w[i])cnt[j][1] +=count;65}

66}67int res = cnt[e][0

];68

if(dis[e][0] + 1 == dis[e][1])res += cnt[e][1

];69

return

res;70}

7172

intmain()

8687 cin >> s >>e;

8889 cout << dijkstra() <

91return0;

92 }

最短路計數

乙個無向圖上,沒有自環,所有邊的權值均為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的邊,請注意可能有自環與重...

最短路計數

給出乙個n個頂點m條邊的無向無權圖,頂點編號為1 n。問從頂點1開始,到其他每個點的最短路有幾條。第一行包含2個正整數n,m,為圖的頂點數與邊數。接下來m行,每行2個正整數x,y,表示有一條頂點x連向頂點y的邊,請注意可能有自環與重邊 共n行,每行乙個非負整數,第i行輸出從頂點1到頂點i有多少條不同...