分析
- 题目链接:
- 思路:
- 先用BFS求每个节点的最短路径长度,然后使用记忆化搜索统计方案数。
- 注意:
- 使用邻接表保存图的边信息,因为存在重边,如果使用邻接矩阵存储会覆盖重边。
代码
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
int n, m;
const int N = 1e6+10;
int dist[N];
bool st[N];
int f[N];
const int MOD = 1e5+3;
vector<vector<int>> g;
int dfs(int v) {
if(v == 1) return f[v] = 1;
if(f[v] != -1) return f[v];
f[v] = 0;
for(auto u: g[v]) {
if(dist[u] + 1 == dist[v]) {
f[v] = (f[v] + dfs(u)) % MOD;
}
}
return f[v];
}
int main() {
scanf("%d%d", &n, &m);
g.resize(n+1);
memset(f, -1, sizeof f);
int u, v;
for(int i = 0; i < m; i++) {
scanf("%d%d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
memset(dist, 0x3f, sizeof dist);
memset(st, 0, sizeof st);
queue<int> q;
q.push(1);
dist[1] = 0;
st[1] = true;
while(q.size()) {
auto t = q.front(); q.pop();
for(auto v: g[t]) {
if(!st[v]) {
dist[v] = dist[t] + 1;
st[v] = true;
q.push(v);
}
}
}
for(int i = 1; i <= n; i++){
cout<<dfs(i)<<endl;
}
return 0;
}