[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;
}
标签:paths,int,题解,短路,Number,ABC211D,bfs,push
From: https://www.cnblogs.com/2020luke/p/18113971