码迷,mamicode.com
首页 > 其他好文 > 详细

P1144 最短路计数 题解 最短路应用题

时间:2019-11-04 21:25:55      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:起点   节点   names   题解   class   else   its   amp   ble   

题目链接:https://www.luogu.org/problem/P1144
其实这道题目是最短路的变形题,因为数据范围 \(N \le 10^6, M \le 2 \times 10^6\) ,所以直接用Dijkstra算法是不行的,可以使用 Dijkstra+堆优化 或者 SPFA算法来实现。
我这里使用 SPFA算法 来实现 (不会Dijkstra堆优化囧)
这道题目因为需要计数,所以需要在dist数组基础上再开一个cnt数组,其含义如下:

  • \(dist[u]\) :起点 \(1\) 到节点 \(u\) 的最短距离;
  • \(cnt[u]\) :起点 \(1\) 到节点 \(u\) 的最短路径长度。

然后队列扩展的时候:

  • 如果 \(dist[v] \gt dist[u]+1\) ,则更新 \(dist[v] = dist[u] + 1\) ,同时置 \(cnt[v] = cnt[u]\)
  • 如果 \(dist[v] = dist[u]+1\) ,则 \(cnt[v] += cnt[u]\)

这样就可以实现最短路计数(Dijkstra同理)。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000010;
const long long INF = (1LL<<60);
const long long MOD = 100003LL;
vector<int> g[maxn];
queue<int> que;
int n, m, x, y;
long long dist[maxn], cnt[maxn];
bool inq[maxn];
void spfa() {
    dist[1] = 0;
    for (int i = 2; i <= n; i ++) dist[i] = -1;
    cnt[1] = 1;
    que.push(1);
    while (!que.empty()) {
        int u = que.front();
        que.pop();
        inq[u] = false;
        int sz = g[u].size();
        for (int i = 0; i < sz; i ++) {
            int v = g[u][i];
            if (dist[v] == -1 || dist[v] >= dist[u] + 1) {
                if (dist[v] == -1 || dist[v] > dist[u] + 1) {
                    dist[v] = dist[u] + 1;
                    cnt[v] = cnt[u];
                }
                else {
                    cnt[v] = (cnt[v] + cnt[u]) % MOD;
                }
                if (!inq[v]) {
                    que.push(v);
                    inq[v] = true;
                }
            }
        }
    }
}
int main() {
    scanf("%d%d", &n, &m);
    while (m --) {
        scanf("%d%d", &x, &y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    spfa();
    for (int i = 1; i <= n; i ++)
        printf("%lld\n", cnt[i]);
    return 0;
}

作者:zifeiy

P1144 最短路计数 题解 最短路应用题

标签:起点   节点   names   题解   class   else   its   amp   ble   

原文地址:https://www.cnblogs.com/codedecision/p/11794850.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!