[洛谷1144]最短路计数

思路:

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\n",p[i]->ans);
52     }
53     return 0;
54 }

 

posted @ 2017-07-27 08:35  skylee03  阅读(106)  评论(0)    收藏  举报