ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P1144 最短路计数

2022-05-03 21:03:37  阅读:229  来源: 互联网

标签:node int 短路 js 计数 dijkstra edge P1144 dis


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

 

标签:node,int,短路,js,计数,dijkstra,edge,P1144,dis
来源: https://www.cnblogs.com/marswithme/p/16219388.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有