AcWing 1134. 最短路计数
路径权重都是1,用 bfs找最短路径,找的过程中用cnt数组记录路线条数,需要注意当路径长度相等时,需要将两条路径的条数相加更新
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, M = 4 * N, INF = 0x3f3f3f3f;
int h[N], e[M], ne[M], idx;
int n, m;
int dist[N];
int cnt[N];
int q[N];
int w[N];
void Add(int a, int b){
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++ ;
}
void bfs(){
memset(dist, 0x3f, sizeof dist);
int hh = 0, tt = 0;
q[0] = 1;
dist[1] = 0;
cnt[1] = 1;
while(hh <= tt){
int t = q[hh ++ ];
for(int i = h[t]; ~i; i = ne[i]){
int j = e[i];
if(dist[j] > dist[t] + 1){
dist[j] = dist[t] + 1;
cnt[j] = cnt[t];
q[ ++ tt] = j;
}
else if(dist[j] == dist[t] + 1){
cnt[j] = (cnt[j] + cnt[t]) % 100003;
}
}
}
}
int main()
{
cin>>n>>m;
memset(h, -1, sizeof h);
while(m -- ){
int a, b;
cin>>a>>b;
Add(a, b);
Add(b, a);
}
bfs();
for(int i = 1; i <= n; i ++ ){
cout<<cnt[i]<<endl;
}
return 0;
}