P1144 最短路计数

2022/5/3 23:17:48

本文主要是介绍P1144 最短路计数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

题目链接 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 }

 



这篇关于P1144 最短路计数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程