bfs实现,借用dep比较路径的长度
#include<bits/stdc++.h> #define mod 100003 #define M 2000002 #define N 1000002 using namespace std; int read() { int x=0,f=1;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();} return x*f; } int tot=0; struct EDGE{ int nextt,to; }w[M*2]; int head[N],dep[N],num[N],vis[N]; void add(int a,int b) { tot++; w[tot].nextt=head[a]; w[tot].to=b; head[a]=tot; } void bfs(int s) { queue<int>q; num[s]=1;vis[s]=1;q.push(s); while(!q.empty()) { int x=q.front();q.pop(); for(int i=head[x];i;i=w[i].nextt) { int v=w[i].to; if(!vis[v])dep[v]=dep[x]+1,num[v]=num[x],vis[v]=1,q.push(v); else if(dep[v]==dep[x]+1)num[v]=(num[v]+num[x])%mod;//如果走到过v,那么它的dep是dep[x]+1或更大,num是累加 //先到达v的路径一定更短 } } } int main() { int n=read(),m=read(); for(int i=1;i<=m;++i) { int a=read(),b=read(); add(a,b);add(b,a); } bfs(1); for(int i=1;i<=n;++i) printf("%d ",num[i]); }