最短路计数
#include<iostream> #include<algorithm> #include<cstring> #include<queue> using namespace std; const int N=1000010; queue<int>q; int h[N],e[2*N],ne[2*N],idx,dis[N],res[N],n,m; bool st[N]; void add(int a, int b){ e[idx]=b,ne[idx]=h[a],h[a]=idx++; } void spfa(){ memset(dis,0x3f,sizeof(dis)); dis[1]=0; res[1]=1; st[1]=true; q.push(1); while(q.size()){ int t=q.front(); q.pop(); st[t]=false; for(int i=h[t];~i;i=ne[i]){ int j=e[i]; if(dis[j]>dis[t]+1){ dis[j]=dis[t]+1; res[j]=res[t]; if(!st[j]){ st[j]=true; q.push(j); } }else if(dis[j]==dis[t]+1){ res[j]+=res[t]; res[j]%=100003; } } } } int main(void){ memset(h,-1,sizeof(h)); cin>>n>>m; for(int i=0,a,b;i<m;i++){ cin>>a>>b; add(a,b),add(b,a); } spfa(); for(int i=1;i<=n;i++)cout<<res[i]<<endl; return 0; }