题目
题解
如果当前节点比最短距离大,那么久更新当前节点的距离,如果想等,说明这节点就是最短距离,那么更新cnt即可。
#include<iostream>
#include<cstring>
using namespace std;
const int N=100010,M=400010,mod=100003;
int h[N],ne[M],e[M],idx;
int q[N],dist[N],cnt[N];
void add(int a,int b){
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
void bfs(){
memset(dist,0x3f,sizeof dist);
dist[1]=0;
cnt[1]=1;
int hh=0,tt=0;
q[0]=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])%mod;
}
}
}
}
int n,m;
int main(){
cin>>n>>m;
memset(h,-1,sizeof h);
while(m--){
int a,b;
scanf("%d%d",&a,&b);
add(a,b);add(b,a);
}
bfs();
for(int i=1;i<=n;i++)printf("%d\n",cnt[i]);
return 0;
}