最短路dp,LeetCode 1976. 到达目的地的方案数

一、题目

1、题目描述

你在一个城市里,城市由 n 个路口组成,路口编号为 0n - 1 ,某些路口之间有 双向 道路。输入保证你可以从任意路口出发到达其他任意路口,且任意两个路口之间最多有一条路。

给你一个整数 n 和二维整数数组 roads ,其中 roads[i] = [ui, vi, timei] 表示在路口 uivi 之间有一条需要花费 timei 时间才能通过的道路。你想知道花费 最少时间 从路口 0 出发到达路口 n - 1 的方案数。

请返回花费 最少时间 到达目的地的 路径数目 。由于答案可能很大,将结果对 109 + 7 取余 后返回。

2、接口描述

复制代码
cpp 复制代码
class Solution {
public:
    int countPaths(int n, vector<vector<int>>& roads) {

    }
};

3、原题链接

1976. 到达目的地的方案数


二、解题报告

1、思路分析

比较经典的最短路问题

对于所有的最短路上的每一个点都满足沿着路径到源点的距离最短

思考我们的Dijkstra算法,只有dist[u] + w < dist[v]时会更新,而对于dist[u] + w = dist[v]的情况选择略去,而我们如果利用这一点便可以累加最短路数目

定义f[u]为s到u的最短路数目

执行Dijkstra

如果dist[u] + w < dist[v],那么f[v] = f[u],更新距离的同时v入堆

如果dist[u] + w = dist[v],那么f[v] += f[u],不更新距离也不入堆

2、复杂度

时间复杂度:O(mlogm) 空间复杂度:O(m)

3、代码详解

复制代码
cpp 复制代码
class Solution {
public:
typedef long long ll;
typedef pair<ll, ll> pll;
ll f[205], dist[205], mod = 1e9 + 7;
    int countPaths(int n, vector<vector<int>>& roads) {
        vector<vector<pll>> g(n);
        for(auto& e : roads) g[e[0]].emplace_back(e[1], e[2]), g[e[1]].emplace_back(e[0], e[2]);
        
        memset(f, 0, sizeof f), memset(dist, 0x3f, sizeof dist);
        priority_queue<pll, vector<pll>, greater<pll>> pq;
        dist[0] = 0, f[0] = 1, pq.emplace(0, 0);
        
        while(pq.size()){
            auto [d, u] = pq.top(); pq.pop();
            if(d > dist[u]) continue;
            for(auto [v, w] : g[u]){
                if(d + w < dist[v]) f[v] = f[u], pq.emplace(dist[v] = d + w, v);
                else if(d + w == dist[v]) f[v] = (f[v] + f[u]) % mod;
            }
        }
        return f[n - 1];
    }
};
相关推荐
爱学习的小仙女!2 分钟前
算法效率的度量 时间复杂度 空间复杂度
数据结构·算法
AndrewHZ5 分钟前
【复杂网络分析】什么是图神经网络?
人工智能·深度学习·神经网络·算法·图神经网络·复杂网络
Swizard12 分钟前
拒绝“狗熊掰棒子”!用 EWC (Elastic Weight Consolidation) 彻底终结 AI 的灾难性遗忘
python·算法·ai·训练
fab 在逃TDPIE1 小时前
Sentaurus TCAD 仿真教程(十)
算法
天赐学c语言1 小时前
12.19 - 买卖股票的最佳时机 && const的作用
c++·算法·leecode
菜鸟233号1 小时前
力扣78 子集 java实现
java·数据结构·算法·leetcode
yesyesyoucan2 小时前
在线魔方解谜站:从零入门到精通的智能魔方学习平台
学习·算法
Han.miracle2 小时前
数据结构与算法--008四数之和 与经典子数组 / 子串问题解析
数据结构·算法
!停2 小时前
字符函数和字符串函数
算法
AI科技星2 小时前
圆柱螺旋运动方程的一步步求导与实验数据验证
开发语言·数据结构·经验分享·线性代数·算法·数学建模