[ABC211D] Number of Shortest paths 題解
思路解析
題目其實說得很明白了,就是最短路計數。我們可以用一個 \(s_i\) 表示從起點到 \(i\) 的最短路計數,然後進行 bfs,由於邊權為 \(1\),所以可以使用 bfs 求最短路。如果 \(u \to v\) 是 \(v\) 的最短路的其中一段,就把 \(s_u \to s_v\) 轉移即可。
注意要記得取模。
code
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10, mod = 1e9 + 7;
int n, m, d[N], s[N];
vector<int> g[N];
void bfs() {
memset(d, 0x3f, sizeof(d));
d[1] = 0; s[1] = 1;
queue<int> q;
q.push(1);
while(!q.empty()) {
int u = q.front(); q.pop();
for(auto it : g[u]) {
if(d[it] >= d[u] + 1) {
if(d[it] > 1e8) q.push(it);
d[it] = d[u] + 1;
s[it] = (s[it] + s[u]) % mod;
}
}
}
}
int main() {
cin >> n >> m;
for(int i = 1, u, v; i <= m; i++) {
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
bfs();
cout << s[n];
return 0;
}