1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| struct edge{int v,w;}; vector<edge>e[N]; void add(int u,int v,int w){ e[u].push_back({v,w}); } void solve(){ cin>>n>>m; for(int i=1;i<=m;i++){ int u,v,w;cin>>u>>v; add(u,v,1);add(v,u,1); } vector<int>d(n+1,inf);vector<int>vis(n+1,0); vector<int>ad(n+1,0); priority_queue<pii,vector<pii>,greater<pii>>q; d[1]=0;q.push({0,1});ad[1]=1; while(q.size()){ auto[dis,u]=q.top();q.pop(); if(vis[u])continue; vis[u]=true; for(auto[v,w]:e[u]){ if(d[v]>d[u]+w){ d[v]=d[u]+w; q.push({d[v],v}); ad[v]=ad[u]; } else if(d[v]==d[u]+w){ ad[v]+=ad[u];ad[v]%=mod; q.push({d[v],v}); } } } for(int i=1;i<=n;i++){ if(ad[i])cout<<ad[i]<<endl; else cout<<0<<endl; } }
|