当前位置: 首页 > news >正文

算法题(251):最短路计数

审题:
本题需要我们找到从节点1开始到其他节点的最短路径有多少条

思路:

方法一:dijkstra算法+动态规划

本题的图是无向无权图,也就是说边是双向可走的,边权都是一样的我们可以记为1

由于某个节点的最短路径dist[i]等于他的有效前驱节点(最短路径走到i位置的节点)的dist值相加,所以我们需要通过搜索方法找到节点的有效前驱节点,而这种搜索方法就是dijkstra算法

状态表示:f[i]表示从起点到节点1的最短路径条数

状态转移方程:f[i] = Σf[prev]

填表顺序:按照dijkstra算法的遍历顺序进行更新

解题:

#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
const int N = 1e6 + 10, M = 2e6 + 10, MOD = 100003;
typedef pair<int, int> pii;
int n, m;
vector<int> edges[N];
priority_queue<pii, vector<pii>, greater<pii>> q;
int dist[N],f[N];
bool st[N];
void dijkstra()
{//初始化memset(dist, 0x3f, sizeof dist);memset(f, 0, sizeof f);memset(st, 0, sizeof st);q.push({ 0,1 });dist[1] = 0;//f初始化f[1] = 1;while (q.size()){auto a = q.top(); q.pop();int s = a.second; //添加判断if (st[s]) continue;st[s] = true;for (auto& e : edges[s]){if (dist[s] + 1 < dist[e])//找到e前驱更短路{dist[e] = dist[s] + 1;q.push({dist[e],e});f[e] = f[s];}//这里必须设置成if else,否则前面改成了等于,后面语句条件一定会满足了else if (dist[s] + 1 == dist[e])//找到更多同级最短路{f[e] = (f[e]+f[s])%MOD;}}}}
int main()
{//数据录入scanf("%d%d", &n, &m);for (int i = 1; i <= m; i++){int l, r; scanf("%d%d", &l, &r);edges[l].push_back(r);edges[r].push_back(l);}//dijkstradijkstra();//答案输出for (int i = 1; i <= n; i++){printf("%d\n", f[i]);}return 0;
}

关键1:数据输入输出方式

由于题目中的数据读取和输出量较大,所以为了减少时间消耗,我们采用快速输入输出方式,scanf和printf

关键2:更新时机

当进行松弛操作时,表示当前节点找到了更短的路径,直接将前驱的f值覆盖掉当前节点f值

若松弛操作显示路径相等,说明有其他的同级最短路径被找到了,累加该节点f值

关键3:答案输出要注意取模

题目中特别说明了需要取模,所以我们在进行累加的时候顺便就进行取模操作,最终输出的时候就不用再取模了

http://www.dtcms.com/a/557106.html

相关文章:

  • 济南制作网站的公司吗WordPress page filed
  • JDK 11 环境正确,端口未被占用,但是运行 Tomcat 11 仍然闪退
  • 深度学习(8)Adam 优化器、卷积神经网络与反向传播
  • 上海虹桥停车亲测,省心方案分享
  • 《人工智能基础》[算法篇3]:决策树
  • Rust真的适合写业务后端吗?
  • 绿色农产品网站wordpress空间 腾讯
  • 开源AI智能客服、AI智能名片与S2B2C商城小程序在营销运营中的应用与重要性研究
  • 南通网站开发公司百度seo排名报价
  • 在网站文章锚文本怎么做教育培训机构怎么建设网站
  • 不只是随机停顿:构建拟人化爬虫的行为指纹模型
  • QML-动画
  • 如何是网站排名上升网站开发什么比较有创意
  • css中backdrop-filter 详细使用 ios毛玻璃效果、filter和backdrop-filter使用说明
  • 通过神经网络手搓一个带finetune功能的手写数字识别来学习“深度神经网络”
  • 开发一个企业网站要多少钱青岛房产信息网
  • Linux运维核心命令(入门)
  • Redis_3_Redis介绍+常见命令
  • 企业实训|AI技术在产品研发领域的应用场景及规划——某央企汽车集团
  • linux系统移植过程中挂死问题分析
  • C++笔记:std::variant
  • day03(11.1)——leetcode面试经典150
  • 《算法通关指南:数据结构和算法篇 --- 顺序表相关算法题》---移动零,颜色分类
  • 视觉差网站制作百度站长统计
  • 求职专栏-【面试-自我介绍】
  • Chroma向量数据库详解:高效向量检索在AI应用中的实践指南
  • 【开题答辩全过程】以 风聆精酿啤酒销控一体系统的设计与实现为例,包含答辩的问题和答案
  • 二.docker安装与常用命令
  • 珠海网红打卡景点网站排名优化首页
  • 计算机网络Day01