洛谷 P1144 最短路计数

 1 #include<cmath>
 2 #include<queue>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<iostream>
 6 #include<algorithm>
 7 #define MAXN 300005
 8 #define MAXM 400010
 9 #define P 100003
10 
11 using namespace std;
12 
13 int dis[MAXN];
14 int ans[MAXN];
15 int INQ[MAXN];
16 int head[MAXN];
17 int n,m,cnt;
18 
19 queue<int>Q;
20 
21 struct edge
22 {
23     int to,next;
24 }edge[MAXM];
25 
26 inline void add(int u,int v)
27 {
28     edge[++cnt].to=v;
29     edge[cnt].next=head[u];
30     head[u]=cnt;
31 }
32 
33 inline void SPFA()
34 {
35     memset(INQ,0,sizeof(INQ)); memset(ans,0,sizeof(ans));
36     Q.push(1); INQ[1]=1; ans[1]=1; dis[1]=0;
37     while(!Q.empty())
38     {
39         int u=Q.front(); Q.pop(); INQ[u]=0;
40         for (int i=head[u];i;i=edge[i].next)
41         {
42             int v=edge[i].to;
43             if (dis[v]>dis[u]+1)
44             {
45                 dis[v]=dis[u]+1;
46                 ans[v]=ans[u];
47                 if (!INQ[v])
48                 {
49                     Q.push(v);
50                     INQ[v]=1;
51                 }
52             }
53             else if (dis[v]==dis[u]+1) ans[v]=(ans[v]+ans[u])%P;
54         }
55     } return ;
56 }
57 
58 inline void solve()
59 {
60     memset(head,0,sizeof(head)); memset(dis,0x7f,sizeof(dis));
61     scanf("%d%d",&n,&m); cnt=0;
62     for (int i=1,x,y;i<=m;i++) scanf("%d%d",&x,&y),add(x,y),add(y,x);
63     SPFA(); for (int i=1;i<=n;i++) printf("%d\n",ans[i]); return ;
64 }
65 
66 int main()
67 {
68     solve();
69     return 0;
70 }

 

posted @ 2016-10-24 22:41  Angel_wing  阅读(107)  评论(1)    收藏  举报