【矩阵乘法 floyd】洛谷_2886 牛继电器Cow Relays

恰好经过k条边的最短路径——Floyd的递增算法 题目描述 给定一张由T条边构成的无向图,点的编号为1~1000之间的整数。 求从起点S到终点E恰好经过N条边(可以重复经过)的最短路。 注意: 数据保证一定有解。 输入格式 第1行:包含四个整数N,T,S,E。 第2…T+1行:每行包含三个整数,描述一条边的边长以及构成边的两个点的编号。 输出格式 输出一个整数,表示最短路的长度。 数据范围 2 ≤ T ≤ 100, 2 ≤ N ≤ 106 输入样例: 2 6 6 4 11 4 6 4 4 8 8 4 9 6 6 8 2 6 9 3 8 9 输出样例: 10 阅读详情

题意

一张TTT条边的图,点的编号在1∼10001\sim10001∼1000之间。求出从起点SSS到终点EEE刚好经过NNN条边的最短路。

思路

因为边最多只有100100100条,而点编号在1∼10001\sim10001∼1000内,所以点数最多只有200200200个,然后我们可以先离散化。
离散化数据把它映射到1∼P1\sim P1∼P的编号中。设AAA为这个图的邻接矩阵,我们可以看看这个方程:
b[i][j]=min1≤k≤p(A[i][k]+A[k][j])b[i][j]=\underset{1\leq k\leq p}{min}(A[i][k]+A[k][j])b[i][j]=1≤k≤pmin​(A[i][k]+A[k][j])
因为AAA是初始矩阵,所以代表经过111条边的最短路径。然而BBB是从AAA得来,我们枚举了一个断点kkk,所以BBB是两条边的最短路。
我们设矩阵AnA^nAn保存两点之间刚好经过nnn条路的最短路,可以得出:
(Ar+m)[i][j]=min1≤k≤p((Ar)[i][k]+(Am)[k][j])(A^{r+m})[i][j]=\underset{1\leq k\leq p}{min}((A^r)[i][k]+(A^m)[k][j])(Ar+m)[i][j]=1≤k≤pmin​((Ar)[i][k]+(Am)[k][j])
我们发现这个东西和矩阵乘法很像,只不过求和变成求最值,乘积变成和。因为是求最值,显然可以得出这个矩阵乘法也满足结合律,然后我们就可以用快速幂加速来做了。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>

int N, T, S, E, P;
int id[1001];
struct matrix{
    int a[201][201];
}f;

matrix operator *(matrix &a, matrix &b) {
    matrix c;
    memset(c.a, 127 / 3, sizeof(c.a));
    for (int i = 1; i <= P; i++)
        for (int j = 1; j <= P; j++)
            for (int k = 1; k <= P; k++)
                c.a[i][j] = std::min(c.a[i][j], a.a[i][k] + b.a[k][j]);
    return c;
}

void ksm(matrix &f, int b) {
    matrix result = f;//答案先存了f所以指数-1
    for (; b; b >>= 1) {
        if (b & 1) result = result * f;
        f = f * f;
    }
    f = result;
}

int main() {
    scanf("%d %d %d %d", &N, &T, &S, &E);
    memset(f.a, 127 / 3, sizeof(f.a));
    for (int i = 1, x, y, z; i <= T; i++) {
        scanf("%d %d %d", &z, &x, &y);
        x = id[x] ? id[x] : id[x] = ++P;
        y = id[y] ? id[y] : id[y] = ++P;//离散
        f.a[x][y] = f.a[y][x] = std::min(f.a[x][y], z);
    }
    ksm(f, N - 1);
    printf("%d", f.a[id[S]][id[E]]);
}
牛站(矩阵乘法,类floyd:边数限制的最短路问题) 给定一张由T条边构成的无向图,点的编号为1~1000之间的整数。 求从起点S到终点E恰好经过N条边(可以重复经过)的最短路。 注意: 数据保证一定有解。 输入格式 第1行:包含四个整数N,T,S,E。 第2..T+1行:每行包含三个整数,描述一条边的边长以及构成边的两个点的编号。 输出格式 输出一个整数,表示最短路的长度。 数据范围 2≤T≤100, 2≤N≤10^6 输入样例: 2 6 6 4 11 4 6 4 4 8 8 4 9 6 6 8 2 6 9 3 8 9 输出样例: 阅读详情

相关推荐

SPSS线性混合模型实战:手把手复现一篇老年认知研究的统计结果(含代码)

本文详细介绍了如何使用SPSS线性混合效应模型复现老年认知研究的统计结果,涵盖数据准备、模型构建、结果解读及可视化全流程。特别针对重复测量数据分析,提供了SPSS菜单操作与语法编写的实用技巧,帮助研究者高效处理复杂数据并验证模型假设。

weixin_42562079的博客 516

AcWing 345 牛站

题目描述: 给定一张由T条边构成的无向图,点的编号为1~1000之间的整数。 求从起点S到终点E恰好经过N条边(可以重复经过)的最短路。 注意: 数据保证一定有解。 输入格式 第1行:包含四个整数N,T,S,E。 第2..T+1行:每行包含三个整数,描述一条边的边长以及构成边的两个点的编号。 输出格式 输出一个整数,表示最短路的长度。 数据范围 2≤T≤100, 2≤N≤10^6 输入样例: 2 6 6 4 11 4 6 4 4 8 8 4 9 6 6 8 2 6 9 3 8 9

昂昂累世士的博客 452

使用fairseq从头开始训练一个中英神经机器翻译模型

前言 由于毕设是做神经机器翻译相关,所以先尝试一下神经机器翻译的整个流程是非常有必要的。故将在news-commentary-v15语料上训练有监督中英NMT模型的整个流程,包括工具和数据的准备、数据的预处理、训练及解码等过程,以及过程中遇到的问题和解决方案记录在此,以供后期回顾,也希望能够给予别人一些帮助。附本人博客 1 相关工具及目录结构 1.1 相关工具 除jieba是使用pip install安装外,其他几个工具都是建议直接克隆库到自己的用户目录中,方便使用其脚本(moses/subword-nmt

qq_42734797的博客 2万+

牛站

牛站 给定一张由T条边构成的无向图,点的编号为1~1000之间的整数。 求从起点S到终点E恰好经过N条边(可以重复经过)的最短路。 输入格式 第1行:包含四个整数N,T,S,E。 第2…T+1行:每行包含三个整数,描述一条边的边长以及构成边的两个点的编号。 输出格式 输出一个整数,表示最短路的长度。 数据范围 2≤T≤100, 2≤N≤106 输入样例: 2 6 6 4 11 4 6 4 4 8 ...

spnooyseed的博客 794

Unity XR Interaction Toolkit(二)手柄交互

XR Interaction 手柄事件和抓取设置

qq_36608844的博客 8495

SAP License USMM SLAW2 SAP审计

引言 企业每年都会收到SAP License审计邮件,邮件内容大致就是根据贵公司与SAP签定的合同XXX条款规定,贵公司所安装的SAP系统需要进行测定。 关键字: SAP License、 SAP USMM、 SLAW2、 SAP 账号、SAP 账号审计、 SAP License 审计、 SAP 审计报告、SAP 账号优化 SAP License审计邮件 企业每年都会收到SAP License审计邮件,邮件内容大致就是根据贵公司与SAP签定的合同XXX条款规定,贵公司所安...

感悟人生 2978

牛站——bellmanford 不是正解

给定一张由T条边构成的无向图,点的编号为1~1000之间的整数。 求从起点S到终点E恰好经过N条边(可以重复经过)的最短路。 注意: 数据保证一定有解。 输入格式 第1行:包含四个整数N,T,S,E。 第2…T+1行:每行包含三个整数,描述一条边的边长以及构成边的两个点的编号。 输出格式 输出一个整数,表示最短路的长度。 数据范围 2≤T≤100, 2≤N≤106 输入样例: 2 6 6 4 11 4 6 4 4 8 8 4 9 6 6 8 2 6 9 3 8 9 输出样例: 10 心态炸裂,不知道是网站的

k__opp的博客 266

基于STM32L4XX、HAL库的E180-ZG120B ZigBee模块驱动程序设计

/ 频率: 470MHz, SF7, BW125kHz, CR4/5, 功率14dBm。// 检查是否收到完整响应(根据实际情况调整)// 每5秒发送一次。PB0 <---> AUX (可选,用于状态检测)// 实际发送命令可能需要根据模块AT指令集调整。PC13 <---> RESET (可选)// 处理接收到的数据。// 缓冲区满,从头开始。// 其他必要的HAL库初始化代码...// 初始化E180模块。// 启动UART接收。// 如果需要等待响应。// 配置LoRa参数。

zhusl6688的博客 380

poj3613-floyd+邻接矩阵乘法

参考于:08年论文:俞华程《矩阵乘法在信息学中的应用》 图邻接矩阵上的乘法:              图的邻接矩阵可以唯一地表示一张图,并且有很多神奇的性质。接下来我们 将研究邻接矩阵上的矩阵乘法。         首先,我们来看一下最简单的情况,一张N个点的无向无权图。如果点a和 点b连边,那么邻接矩阵G[a,b] = G[b,a] = 1,否则都等于0。考虑邻接矩阵自 乘,即G

Code-Dreamer的博客 2231

Python爬虫实战 | 拼多多商品评论采集与深度分析

本文从 API 调用、网页渲染到情感分析与关键词提取,全流程剖析了“拼多多商品评论采集与分析”项目。Scrapy + API 可快速抓取评论;Playwright 可突破 API 限制,抓取完整页面内容;数据清洗 + 分析揭示用户真实反馈;可持续部署、扩展至更多商品 & 时间段;

2201_76125261的博客 1696

Unity之如何接入NPOI 快速读取Excel

NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。 NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目

TxNet 4395

洛谷2886 [USACO07NOV]牛继电器Cow Relays (矩阵乘法+Floyd)

题目链接 一道很有纪念意义的题目啊qwq 感觉其实还不是很理解。 首先,根据题目的数据范围,我们可以想到用floydfloydfloyd去解决这个问题。 我们会发现,假设我们已经知道了一个经过xxx条路,到某个点的最短路矩阵aaa,同时我们知道了每个点出发经过一条路到各个点的最短路矩阵bbb,我们令c[i][j]=min(c[i][j],a[i][k]+b[k][j])c[i][j]=min(c[...

y_immortal的博客 QwQ(qdez_ymh) 274

通信算法之264: DJI O2 协议物理层逆向工程解析

对于 DroneID,标志之间的间隙由循环前缀 (CP) 填充:每个标志末尾的副本附加在相应标志的开头。有了关于确切标志开始的信息,可以使用 FFT 将标志转移到频域 - 来自时域的 1024 个样本导致频域中的 1024 个子载波。使用比特流的解扰和涡轮解码,并将生成的数据映射到如上的DroneID 结构,通过逆向工程在无人机的固件中找到了它。注意到一些无人机(Mavic 2 和更早的 OcuSync 无人机)不发送第一个标志(标志 1),这导致更短的帧持续时间为 576 µs。//产品型号数字代号。

leegang12的专栏 3942

洛谷P2886 [USACO07NOV]牛继电器Cow Relays

题意很简单,给一张图,把基本的求起点到终点最短路改成求经过k条边的最短路。 求最短路常用的算法是dijkstra,SPFA,还有floyd。 考虑floyd的过程: c[i][j]=min(c[i][j],a[i][k]+b[k][j]); 自然而然联想到矩阵乘法,每次加入一个点就相当于多加一条边,那么加k次就是k条边的最短路。 但是k可能很大(见数据范围),那么显然直接循环矩乘k次是行...

weixin_30765475的博客 189

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

[LUOGU] P2886 [USACO07NOV]牛继电器Cow Relays

https://www.luogu.org/problemnew/show/P2886 给定无向连通图,求经过k条边,s到t的最短路 Floyd形式的矩阵乘法,同样满足结合律,所以可以进行快速幂。 离散化大可不必sort+unique,因为我们甚至并不在乎相对大小,只是要一个唯一编号,可以开一个桶记录 之所以进行k-1次快速幂,是因为邻接矩阵本身就走了一步了。 ...

weixin_34090562的博客 134

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

fwdiary(7) 矩阵乘法,线段树

只需要去第k维状态,又是个矩阵乘法,显然可以用快速幂优化。那么接下来关注的就是第一维怎么求,又想到可能不用机会也可能是答案,因此还要求第0维。第0维就是floyd直接求最短路,第1维求法:枚举在哪条边上使用魔法。已知邻接矩阵n次幂 是经过n条边的最短路。同样运用动态规划思想,如果r小于l,证明是环形,所以l到n增值,再1到r增值。l到n最小值,再和1到r最小值,二者的最小值就是答案。k次机会可以是花费变成相反数,求最短路。接着就可以快速幂咯。

weixin_64197656的博客 215

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

《算法竞赛进阶指南》,USACO2007 牛站

题解:《算法竞赛进阶指南》,USACO2007 牛站

qq_61935738的博客 288

345 牛站(类floyd算法求解恰好经过k条边的最短路径)

1. 问题描述: 2. 思路分析: 3. 代码如下: from typing import List class Solution: N = 210 # 使用的其实是倍增的思想 def mul(self, n: int, a: List[List[int]], b: List[List[int]]): INF = 10 ** 10 t = [[INF] * self.N for i in range(self.N)]

二哈 698

floyd-warshall算法浅理解

相比于矩阵乘法,floyd巧妙利用了最短路具有最优子结构的性质,即最短路径的子路径也是最短路径,得到以。的一条最短路径权重)为状态的转移方程,减少每次迭代的计算量,而且迭代过程只需保存两个矩阵。,就是找到前一个矩阵的第i行第k个元素以及第j列第k个元素求和和。(为从i到j的一条中间节点全部取自集合。,这也允许我们方便地进行手工验证。时,仅对应floyd算法的一步松弛。

qq_23096319的博客 684

floyd变形——牛站

牛站 给定一张由T条边构成的无向图,点的编号为1~1000之间的整数。 求从起点S到终点E恰好经过N条边(可以重复经过)的最短路。 注意: 数据保证一定有解。 输入格式 第1行:包含四个整数N,T,S,E。 第2…T+1行:每行包含三个整数,描述一条边的边长以及构成边的两个点的编号。 输出格式 输出一个整数,表示最短路的长度。 数据范围 2≤T≤100, 2≤N≤106 输入样例: 2 6 6 4...

行走天涯的豆沙包的博客 410

[离散化][倍增][floyd变形]牛站 AcWing345

给定一张由T条边构成的无向图,点的编号为 1∼1000之间的整数。 求从起点S到终点E恰好经过N条边(可以重复经过)的最短路。 注意: 数据保证一定有解。 输入格式 第1行:包含四个整数 N,T,S,E。 第 2..T+1行:每行包含三个整数,描述一条边的边长以及构成边的两个点的编号。 输出格式 输出一个整数,表示最短路的长度。 数据范围 2≤T≤100, 2≤N≤10^6 输入样例: 2 6 6 4 11 4 6 4 4 8 8 4 9 6 6 8 2 6...

Cloth的博客 372

Floyd算法--------------牛站

给定一张由T条边构成的无向图,点的编号为1~1000之间的整数。 求从起点S到终点E恰好经过N条边(可以重复经过)的最短路。 注意: 数据保证一定有解。 输入格式 第1行:包含四个整数N,T,S,E。 第2…T+1行:每行包含三个整数,描述一条边的边长以及构成边的两个点的编号。 输出格式 输出一个整数,表示最短路的长度。 数据范围 2≤T≤1002≤T≤100, 2≤N≤1062≤N≤106 输入...

qq_45772483的博客 384

【结论&例题】【图(Floyd)&矩阵】图邻接矩阵上的乘法

1、 结论1: 对于一个图,若x到y有一条边,则a[x][y]=1,若有m条边,则a[x][y]=m,若无边则为0; 所得矩阵求k次方后的矩阵中a[x][y]的值即表示从x出发行走k条边后到达y的方案数(可重复经过一点) eg: NKOJ 1893 路径方案数 时间限制 : 10000 MS 空间限制 : 65536 KB 问题描述 给定一个有向简单图,图中总共n个点,

ANG 2865

Floyd算法过程矩阵的计算

前几天在看Floyd算法的时候,虽然感觉程序很简单,但是让你动手写那些过程矩阵的时候就感觉不怎么简单了,就上网找找看有木有简便的计算方法,搜索之后没有发现有现成的例子,只搜到了两句“弄两条线,从左上角挪到右下角”,“十字交叉法,从左上角到右下角”,除此之外就再也木有找到有用的东西

dstmath的专栏 7545

Floyd + 矩阵快速幂 + 离散化 - Cow Relays - POJ 3613

Floyd + 矩阵快速幂 + 离散化 - Cow Relays - POJ 3613 题意: 给定一张由T条边构成的无向图,点的编号为1~1000之间的整数。 求从起点S到终点E恰好经过N条边(可以重复经过)的最短路。 注意: 数据保证一定有解。 输入格式 第1行:包含四个整数N,T,S,E。 第2…T+1行:每行包含三个整数,描述一条边的边长以及构成边的两个点的编号。 输出格式 输出一个整数,表示最短路的长度。 数据范围 2≤T≤100,2≤N≤1062≤T≤100, 2≤N≤10^62≤T≤100,2

njuptACMcxk的博客 346

矩阵乘法的并行化算法讨论

矩阵乘法是线性代数里面会讲到的一种非常基础、也十分普遍的计算规则。另一方面,矩阵乘法同时也是并行计算领域常常被用来作为范例的一个话题。它的特点是首先计算量可能相当大,适合利用并行实现来提高效率。其次,它所使用的各种数据之间(矩阵中的元素)没有相互依赖性,可以充分使用并行处理的计算资源

白马负金羁 3万+
上一篇: 【最短路】洛谷_1073 最优贸易
下一篇: 【矩阵乘法 模版】洛谷_3390 矩阵快速幂
nymph181
博客等级 码龄9年 40粉丝 458原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值