思路:
Dijkstra求最短路,同时统计最短路个数,当新增最短路时,增加的条数是父亲结点的条数。
1 #include<cstdio> 2 #include<cctype> 3 #include<vector> 4 #include<functional> 5 #include<ext/pb_ds/priority_queue.hpp> 6 inline int getint() { 7 char ch; 8 while(!isdigit(ch=getchar())); 9 int x=ch^'0'; 10 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); 11 return x; 12 } 13 const int N=1000000,inf=0x7fffffff,mod=100003; 14 std::vector<int> e[N]; 15 inline void add_edge(const int u,const int v) { 16 e[u].push_back(v); 17 e[v].push_back(u); 18 } 19 struct Vertex { 20 int id,d,ans; 21 bool operator > (const Vertex &x) const { 22 return d>x.d; 23 } 24 }; 25 __gnu_pbds::priority_queue<Vertex,std::greater<Vertex> > q; 26 __gnu_pbds::priority_queue<Vertex,std::greater<Vertex> >::point_iterator p[N]; 27 bool v[N]={0}; 28 int main() { 29 int n=getint(),m=getint(); 30 while(m--) { 31 add_edge(getint(),getint()); 32 } 33 for(int i=1;i<=n;i++) { 34 p[i]=q.push((Vertex){i,(i==1)?0:inf,(i==1)?1:0}); 35 } 36 for(Vertex u=q.top();u.d!=inf;u=q.top()) { 37 for(unsigned int i=0;i<e[u.id].size();i++) { 38 if(v[e[u.id][i]]) continue; 39 int &v=e[u.id][i]; 40 if(u.d+1<p[v]->d) { 41 q.modify(p[v],(Vertex){v,u.d+1,p[u.id]->ans%mod}); 42 } 43 else if(u.d+1==p[v]->d) { 44 q.modify(p[v],(Vertex){v,p[v]->d,(p[v]->ans+p[u.id]->ans)%mod}); 45 } 46 } 47 q.modify(p[u.id],(Vertex){u.id,inf,u.ans}); 48 v[u.id]=true; 49 } 50 for(int i=1;i<=n;i++) { 51 printf("%d ",p[i]->ans); 52 } 53 return 0; 54 }