题目链接 https://www.luogu.com.cn/problem/P1144
第一道绿题。。
本是想找几个最短路径做一下,然后去看了看lqs的博客,发现有这么个题(https://www.cnblogs.com/LQS-blog/p/16206505.html),他说:“当然,这类题也可以用dijkstra来处理,不过既然有了最优选择,何必去选择多余的呢,是吧”,欸我偏不,我就用dijkstra做,我还要用spfa做,最后我在用bfs,哈哈哈哈....
(以上不重要,划掉)
堆优化版dijkstra //至于其他方法,明在再更
放AC代码
1 #include<bits/stdc++.h> 2 #define maxm 4000010 3 #define maxn 1000010 4 #define mod 100003 5 using namespace std; 6 int n,m,cnt; 7 int dis[maxn]; 8 int head[maxn]; 9 bool vis[maxn]; 10 int js[maxn];//表示起点到某点的最短路径数目 11 12 struct Edge 13 { 14 int v,w,next; 15 } edge[maxm]; 16 17 void add(int u,int v,int w) 18 { 19 edge[++cnt].v=v; 20 edge[cnt].w=w; 21 edge[cnt].next=head[u]; 22 head[u]=cnt; 23 } 24 25 struct node 26 { 27 int x,y; 28 bool operator < (const node &a) const//堆优化重载运算符,使大根堆变成小根堆。 29 { 30 //反正背过就行了 31 return y>a.y; 32 } 33 }; 34 35 void dijkstra() 36 { 37 memset(dis,0x3f,sizeof(dis));//初始化 38 dis[1]=0; 39 js[1]=1;//自己到自己最短数为1 40 priority_queue<node>q; 41 q.push((node){1,0}); 42 node a; 43 while(!q.empty()) 44 { 45 a=q.top();//用这个node类型变量提取队首元素。 46 int u=a.x,d=a.y; 47 q.pop(); 48 if(d!=dis[u]) continue; 49 for(int i=head[u]; i!=0; i=edge[i].next) 50 { 51 int v=edge[i].v; 52 if(d+edge[i].w==dis[v]) 53 js[v]=(js[u]+js[v])%mod;//边计算边模。 54 if((dis[v]>dis[u]+edge[i].w)) 55 { 56 dis[v]=dis[u]+edge[i].w; 57 js[v]=js[u];//找到一条更短的路径是,用它的前驱的js换它。 58 q.push((node) 59 { 60 v,dis[v] 61 }); 62 } 63 } 64 } 65 } 66 67 int main() 68 { 69 cin>>n>>m; 70 for(register int i=1; i<=m; i++) 71 { 72 int x,y; 73 cin>>x>>y; 74 add(x,y,1); 75 add(y,x,1); 76 } 77 dijkstra(); 78 for(int i=1; i<=n; i++) 79 cout<<js[i]<<endl; 80 return 0; 81 }