洛谷P1144 最短路计数【堆优化dijkstra】

题目https://www.luogu.org/problemnew/show/P1144

题意:问1到各个节点的最短路有多少条。

思路:如果松弛的时候发现是相等的,说明可以经过该点的最短路径到达当前点,也就是说最短路径变多了。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<map>
 4 #include<set>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<cmath> 
 9 #include<stack>
10 #include<queue>
11 #include<iostream>
12 
13 #define inf 0x3f3f3f3f
14 using namespace std;
15 typedef long long LL;
16 typedef pair<int, int> pr;
17 
18 int n, m;
19 const int mod = 1e5 + 3;
20 const int maxn = 1e6 + 5;
21 const int maxm = 2e6 + 5;
22 int head[maxn];
23 struct edge{
24     int to, nxt;
25 }e[maxm * 2];
26 int tot = 0;
27 
28 void add(int x, int y)
29 {
30     e[++tot].to = y;
31     e[tot].nxt = head[x];
32     head[x] = tot;
33     e[++tot].to = x;
34     e[tot].nxt = head[y];
35     head[y] = tot;
36 }
37 
38 struct cmp{
39     bool operator()(const pr &a, const pr &b)
40     {
41         return a.first > b.first;
42     }
43 }; 
44 
45 int d[maxn], cnt[maxn];
46 bool vis[maxn];
47 void dijkstra()
48 {
49     memset(d, 0x3f, sizeof(d));
50     priority_queue<pr>que;
51     vis[1] = true;
52     cnt[1] = 1;
53     d[1] = 0;
54     que.push(make_pair(d[1], 1));
55     while(!que.empty()){
56         pr now = que.top();que.pop();
57         vis[now.second] = true;
58         for(int i = head[now.second]; i; i = e[i].nxt){
59             if(d[e[i].to] > d[now.second] + 1){
60                 d[e[i].to] = d[now.second] + 1;
61                 cnt[e[i].to] = cnt[now.second];
62                 que.push(make_pair(-d[e[i].to], e[i].to));
63             }
64             else if(d[e[i].to] == d[now.second] + 1){
65                 cnt[e[i].to] = (cnt[e[i].to] + cnt[now.second]) % mod;
66             }
67         }
68     }
69     
70 }
71  
72 int main()
73 {
74     scanf("%d%d", &n, &m);
75     for(int i = 0; i < m; i++){
76         int x, y;
77         scanf("%d%d", &x, &y);
78         add(x, y);
79     }
80     dijkstra();
81     for(int i = 1; i <= n; i++){
82         printf("%d
", cnt[i]);
83     }
84 }
原文地址:https://www.cnblogs.com/wyboooo/p/11095609.html