zoukankan      html  css  js  c++  java
  • P1144 最短路计数 题解 最短路应用题

    题目链接:https://www.luogu.org/problem/P1144
    其实这道题目是最短路的变形题,因为数据范围 (N le 10^6, M le 2 imes 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
    ", cnt[i]);
        return 0;
    }
    

    作者:zifeiy

  • 相关阅读:
    pdf文件怎么转换成word文档
    数据库的发展历程
    数据库的三级模式
    数据库概述
    时间序列的自回归模型—从线性代数的角度来看
    数据清洗
    sql commit的三种方式
    数据库标准语言SQL((Structured Query Language)
    正则化推导转载
    leetcode刷题
  • 原文地址:https://www.cnblogs.com/codedecision/p/11794850.html
Copyright © 2011-2022 走看看