【牛站 / USACO2007】

题目


在这里插入图片描述



思路


离散化(降低空间复杂度)

点的编号 ∈ [ 1 , 1000 ] ,但是点的个数最多为 2 ⋅ T ∈ [ 4 , 200 ] 点的编号 \in [1, 1000],但是点的个数最多为 2 \cdot T \in[4, 200] 点的编号[1,1000],但是点的个数最多为2T[4,200]
因此采用离散化处理可以降低空间复杂度 因此采用离散化处理可以降低空间复杂度 因此采用离散化处理可以降低空间复杂度
采用映射unordered_map + 计数器n


类Floyd算法(算法核心)

首先回顾一下Floyd算法

for(int k = 1; k <= n; k++)
{for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){g[i][j] = min(g[i][j], g[i][k] + g[k][j]);}}
}

该算法的思路是考虑各个中转点来不断更新最短路径


可能会有疑问是关于中转点的遍历时机
但是只要记住一句话,路径可以按照任意结合的顺序形成:以 i 为中转点的大路径可能不会在 k = i 就被更新好,但是他所需要的,中转点为 i 的部分一定会在 k = i 之后被更新好



类Floyd

for(int k = 1; k <= n; k++){for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){temp[i][j] = min(temp[i][j], a[i][k] + b[k][j]);}}}

该算法的思路是考虑各个中转点来更新最短路径


两者的区别在于,类Floyd不会拿用前一个中转点更新的路径继续更新以其他点为中转点的路径,换句话说:类Floyd只能用两个旧的状态迭代新的状态,不能使用新的状态进行迭代
这有一个好处:如果 a a a x x x 条边路径的集合, b b b y y y 条边路径的集合,那么进行一次迭代(类Floyd)之后,新状态集合为 x + y x+y x+y 条边路径的集合,由此,我们就可以控制一条路径含边的数量了



快速幂(降低时间复杂度)

k条边的路径可以按照任意结合的顺序形成
例如: ( a ⇒ b ) ⇒ ( b ⇒ c ) ⇒ ( c ⇒ d ) ( 1 + 1 + 1 ),也可以( a ⇒ b ) ⇒ ( b ⇒ c ⇒ d ) ( 1 + 2 ),更可以 ( a ⇒ b ⇒ c ) ⇒ ( c ⇒ d ) ( 2 + 1 ) 例如: (a \Rightarrow b) \Rightarrow (b \Rightarrow c) \Rightarrow (c \Rightarrow d) (1+1+1),也可以 (a \Rightarrow b) \Rightarrow \; ( b \Rightarrow c \Rightarrow d) (1+2), 更可以 (a \Rightarrow b \Rightarrow c) \Rightarrow (c\Rightarrow d) (2+1) 例如:(ab)(bc)(cd)1+1+1),也可以(ab(bcd)1+2),更可以(abc)(cd)2+1


因此我们将k作二进制唯一分解。将初态为1的g对应的边长值不断翻番,并且每次将g的边合并到初态为0的ans中......
最终我们就可以得到对应边长值为k的邻接矩阵ans



关于一些细节
if(!id.count(S)) id[S] = ++n;S = id[S]; //为什么不写到if里?if(!id.count(E)) id[E] = ++n;E = id[E];

哪怕之前进行过离散化处理,此时点的编号也要更新才对啊。不能够说离散化处理了这个 id 就好了,我不用离散化之后的S,我还用原来的S


for (int i = 1; i <= n; i ++ ) ans[i][i] = 0; //为啥g[i][i]不能是0,这个非得是0

ans[i][i]必须为0是因为第一次mul(ans,ans,g)的需要:g初态存的是边为1的路径,按理来说此时ans进行mul操作后能够合成边为1的路径,实现起来就是靠(0+1),而且边为0的路径不会继续存在因为(x+1)>0


同理,g 中不搞 g[i][i] = 0 是因为 g 的初态表示边为1的路径,i 到 i 算边为 0。如果搞g[i][i] = 0,mul(g, g, g) 迭代一次后,会存在边为(0+1)的路径,我们就丧失了对于边这个参数的掌控


举例:


(边数为1)初态g为:

123
1inf1inf
21inf2
3inf2inf

(边数为0)初态ans为:

123
10infinf
2inf0inf
3infinf0

ans迭代一次后:等同初态g(边数为1)

123
1inf1inf
21inf2
3inf2inf

注意此时ans[i][i]不再是0,因为ans存储的路径的边数限制为1,对应代码上就是必须是旧ans和g合成的新路径才会保存

g迭代一次后(边数为2):

123
12inf3
2inf2inf
33inf4

ans迭代一次后(边数为3):

123
1inf3inf
23inf4
3inf4inf


代码


#include <bits/stdc++.h>
using namespace std;const int N = 210;int g[N][N], ans[N][N];
unordered_map<int, int> id;
int k, m, S, E, n;void mul(int c[][N], int a[][N], int b[][N])
{int temp[N][N];memset(temp, 0x3f, sizeof temp);for(int k = 1; k <= n; k++){for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){temp[i][j] = min(temp[i][j], a[i][k] + b[k][j]);}}}memcpy(c, temp, sizeof temp);
}
void qmi()
{memset(ans, 0x3f, sizeof ans);for (int i = 1; i <= n; i ++ ) ans[i][i] = 0;while(k){if(k & 1) mul(ans, ans, g);mul(g, g, g);k >>= 1;}
}
int main()
{cin >> k >> m >> S >> E;if(!id.count(S)) id[S] = ++n;S = id[S];if(!id.count(E)) id[E] = ++n;E = id[E];memset(g, 0x3f, sizeof g);for(int i = 1; i <= m; i++){int a, b, c;cin >> c >> a >> b;if(!id.count(a)) id[a] = ++n;a = id[a];if(!id.count(b)) id[b] = ++n;b = id[b];g[a][b] = g[b][a] = min(g[a][b], c);}qmi();cout << ans[S][E];return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/419345.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python文件自动化(4)

接上节课内容&#xff0c;在开始正式移动文件到目标文件夹之前&#xff0c;我们需要再思考一个问题。在代码运行之前&#xff0c;阿文的下载文件夹里已经存在一些分类文件夹了&#xff0c;比如图例中“PDF文件”这个文件夹就是已经存在的。这样的话&#xff0c;在程序运行时&am…

电脑硬盘数据丢失了怎么恢复?简单实用的硬盘数据找回的方法

我们的电脑使用硬盘作为存储设备来保存数据&#xff0c;硬盘里的数据是存储在扇区上&#xff0c;这些存储数据的单元则位于表面有磁性材料的旋转的盘片上。硬盘内部的磁头悬浮于高速旋转的盘片上&#xff0c;用于读写和检索数据。 假如我们使用电脑时不小心删除了某个文件&…

【B题第二套完整论文已出】2024数模国赛B题第二套完整论文+可运行代码参考(无偿分享)

2024数模国赛B题完整论文 摘要&#xff1a; 随着电子产品制造业的快速发展&#xff0c;质量控制与成本优化问题成为生产过程中亟待解决的核心挑战。为应对生产环节中的质量不确定性及成本控制需求&#xff0c;本文结合抽样检测理论和成本效益分析&#xff0c;通过构建数学模型…

ELK笔记

要搞成这样就需要钱来买服务器 开发人员一般不会给服务器权限&#xff0c;不能到服务器上直接看日志&#xff0c;所以通过ELK看日志。不让开发登录服务器。即使你查出来是开发的问题&#xff0c;费时间&#xff0c;而且影响了业务了&#xff0c;就是运维的问题 开发也不能登录…

2024国赛数学建模C题论文:基于优化模型的农作物的种植策略

大家可以查看一下35页&#xff0c;包含结构完整&#xff0c;数据完整的C题论文&#xff0c;完整论文见文末名片 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注释&#xf…

Computer Exercise

每日一练 单选题 &#xff08;     D     &#xff09; 的作用是在外界中断供电的情况下&#xff0c;及时给计算机等设备供电。 A.WPS     B.USB     C.UBS     D.UPS&#xff08;    B     &#xff09;广泛应用于精密仪器、医疗设备等对电流稳定性要求较高的场…

Unity之获取Avpro视频画面并在本地创建缩略图

一、效果 获取StreamingAssets文件夹下的所有视频&#xff08;包含其子文件夹&#xff09;&#xff0c;获取指定时间的视频画面&#xff0c;然后将图片保存到本地磁盘中。 二、关于Avpro的事件监听 当指定视频时间进度时会触发FinishedSeeking&#xff0c;代表加载完成这时我们…

fpga系列 HDL:Relu激活函数实现与仿真

代码实现对OUTPUT_NODES个32位浮点数进行RELU操作。32位浮点数的二进制表示遵循 IEEE 754 标准&#xff0c;通常称为单精度浮点数。这个标准定义了浮点数的表示方法&#xff0c;具体分为三个部分&#xff1a; 符号位 (1 bit): 用于表示浮点数的正负。&#xff08; 0 表示正数&a…

全国糖酒会,就这5个字。“会天下美味”

“全国糖酒会&#xff0c;会天下美味”&#xff0c;是全国糖酒会的品牌口号。这个品牌口号来的非常偶然。 两年前&#xff0c;全国糖酒会准备更新标志之时&#xff0c;也设计了一个品牌口号。新标志发布前几天&#xff0c;临时作了调整&#xff0c;最终变成了“全国糖酒会&…

linux下oracle启动及关于pfile和spfile启动参数文件的配置

在现代企业环境中&#xff0c;Oracle数据库作为关键的业务支撑平台&#xff0c;承载着大量的数据处理和事务管理任务。 无论是对于DBA&#xff08;数据库管理员&#xff09;还是开发人员来说&#xff0c;掌握Oracle数据库的基本操作和配置技巧都是至关重要的。本文提供了一份全…

Flutter基本组件Text使用

Text是一个文本显示控件&#xff0c;用于在应用程序界面中显示单行或多行文本内容。 Text简单Demo import package:flutter/material.dart;class MyTextDemo extends StatelessWidget {const MyTextDemo({super.key});overrideWidget build(BuildContext context) {return Sca…

Protobuf库的使用

文章目录 Protobuf是什么Protobuf使⽤流程介绍ProtoBuf的使用创建.proto⽂件指定proto3语法package声明符定义消息&#xff08;message&#xff09;编译contacts.proto⽂件命令如下&#xff1a;序列化与反序列化的使⽤ Protobuf是什么 ProtoBuf&#xff08;全称ProtocolBuffer…

【Python基础】Python函数

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程基础知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、函数的定义与调用三、函数参数3.1 位置参数3.2 默认参数3.3 可变数量参数&#xff08;或不定长参数…

若依框架登录鉴权详解(动态路由)

若依框架登录鉴权&#xff1a;1.获取token&#xff08;过期在响应拦截器中实现&#xff09;,2.基于RBAC模型获取用户、角色和权限信息&#xff08;在路由前置守卫&#xff09;&#xff0c;3.根据用户权限动态生成&#xff08;从字符串->组件&#xff0c;根据permission添加动…

【C++进阶】hash表的封装

文章目录 hash表哈希表的关键组成部分哈希表的优缺点优点&#xff1a;缺点&#xff1a; 常见应用场景 开放定址法实现hash表负载因子 (Load Factor)负载因子的意义负载因子的影响再散列 (Rehashing)示例 整体框架insertFinderasehash桶封装框架insertfinderase~HashTable() 总结…

银行结算业务

1.1 银行本票 银行本票是由银行签发的,承诺自己在见票时无条件支付票款给收款人或持票人的业务。银行本票按票面划分为定额本票和不定额本票,按币种划分为人民币银行本票和外币银行本票。人民币银行本票仅在同一交换区域内使用,资金清算利用当地人民银行组织的资金清算形式…

多个vue项目部署到nginx服务器

文章目录 需求一、项目打包1.vue.config.js2.request.js文件3.打包 二、nginx配置 需求 同一个域名安装多个vue项目。 比如&#xff1a;域名为 https://domain.com 后缀。那么通过不同的后缀就能去访问不同的项目地址。 https://domain.com&#xff0c;不加任何后缀&#x…

【第0006页 · 数组】寻找重复数

【前言】本文以及之后的一些题解都会陆续整理到目录中&#xff0c;若想了解全部题解整理&#xff0c;请看这里&#xff1a; 第0006页 寻找重复数 今天想讨论的一道题在 LeetCode 上评论也是颇为“不错”。有一说一&#xff0c;是道好题&#xff0c;不过我们还是得先理解了它才…

微信小程序中如何监听元素进入目标元素

Page({onLoad: function(){// 如果目标节点&#xff08;用选择器 .target-class 指定&#xff09;进入显示区域以下 100px 时&#xff0c;就会触发回调函数。wx.createIntersectionObserver().relativeToViewport({bottom: 100}).observe(.target-class, (res) > {res.inter…

合宙4G模组Air780EX——产品规格书

Air780EX 是合宙通信推出的LTE Cat.1 bis通信模块&#xff1b; Air780EX采用移芯EC618平台&#xff0c;支持LTE 3GPP Rel.13 技术&#xff1b; Air780EX 是4G全网通模块&#xff0c;可适应不同的运营商和产品&#xff0c;确保产品设计的最大灵活性。 其主要特点和优势可以总…