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 5acwing 383.觀光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 }
![](https://pic.w3help.cc/d06/1ff99f5e44d30c4d96744f32145eb.jpeg)
在求最短路數的基礎上進行求次短路數。和在樹中求最大直徑和次大直徑的方法一樣。在最短路數的基礎上:
①如果當前小於最短路,先更新次短路數,加入堆,再更新最短路數,加入堆;
②再如果當前等於最短路,累加最短路數;
③再如果當前小於次短路,更新次短路數,加入堆;
④最後如果當前等於次短路數,累加次短路數。
次短路數和最短路數一樣,都是滿足拓撲序的,所以使用$dijkstra$演算法求解。
1 #include 2 #include 3 #include 4 #include 5 #include 67using
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有多少條不同...