题目链接
此题使用BFS记录最短路的条数。思路如下:
因为是无权无向图,所以只要被BFS到就是最短路径。因此可以记录该点的最短路和最短路的条数:
如果点y还没被访问过,则记录dis[y],同时令ans[y]=ans[x]. 如果点y已经被访问过且当前为最短路径,则ans[y]+=ans[x]
#include<cstdio> #include<cctype> inline long long read(){ long long num=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-') f=-1; ch=getchar(); } while(isdigit(ch)){ num=num*10+ch-'0'; ch=getchar(); } return num*f; } struct Edge{ int next,to; }edge[4000010]; int head[1000010],num; inline void add(int from,int to){ edge[++num]=(Edge){head[from],to}; head[from]=num; } int f[2000000],h,t=1; int dis[1000010]={-1},ans[1000010]={0,1}; int main(){ int n=read(),m=read(); for(int i=1;i<=m;++i){ int from=read(),to=read(); if(from==to) continue; add(from,to); add(to,from); } f[1]=1; while(h++<t) for(int i=head[f[h]];i;i=edge[i].next) if(!dis[edge[i].to]&&edge[i].to!=1){ dis[edge[i].to]=dis[f[h]]+1; f[++t]=edge[i].to; ans[edge[i].to]=ans[f[h]]; } else if(dis[edge[i].to]==dis[f[h]]+1) ans[edge[i].to]=(ans[edge[i].to]+ans[f[h]])%100003; for(int i=1;i<=n;++i) printf("%d ",ans[i]); }