[ABC211D] Number of Shortest paths 題解

2020luke發表於2024-04-04

[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;
}

相關文章