【牛站 / USACO2007】

news2024/12/25 9:25:20

题目


在这里插入图片描述



思路


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

点的编号 ∈ [ 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只能用两个旧的状态迭代新的状态,不能使用新的状态进行迭代
这有一个好处:如果 g g g 的初始状态集合是 k k k 条边路径的集合,那么进行一次迭代(类Floyd)之后,新状态集合为 k + k k+k k+k 条边路径的集合,由此,我们就可以控制一条路径含边的数量了



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

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作二进制唯一分解。将g对应的边长值不断翻番,并且每次将g的边合并到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),即将ans 和 g 中的路径作合并,只有ans[i][i] = 0, ans[i][j] = ans[i][i] + g[i][j]才能够生效,将g[i][j]保存在ans中,否则 g 中 的一些路径没有按照预期进入ans中


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



代码


#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.coloradmin.cn/o/2114266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【NLP】大模型长文本处理技术与GLM-4-Plus评测

本文将介绍Transformer模型在处理长文本数据时所采用的关键技术&#xff0c;特别是旋转位置编码&#xff08;RoPE&#xff09;和Flash Attention机制。 此外&#xff0c;本文介绍GLM系列模型&#xff0c;特别是最新发布的GLM-4-Plus模型。我们将通过实际的评测方法和结果&…

管理学习(一)马云《赢在中国》创业演讲整理

目录 一、小公司也需要制度二、不要害怕冒险三、创业者要的不是技术&#xff0c;而是胆识四、不要惧怕和大企业竞争五、理念不一样&#xff0c;老板永远是对的六、要真实地为客户创造价值七、跟风险投资谈判&#xff0c;说到要做到八、风险投资&#xff0c;只能帮你不能救你九、…

24秋开学考

文件上传 上传一个.php的格式&#xff0c;上面说是非法的文件格式。 2.传了一个phpinfo.gif&#xff0c;说什么在目录里。 3.有两个页面一个labs1一个labs2 &#xff0c;当在第一个页面上传1.jpg&#xff0c;在第二个页面上传1.jpg时&#xff0c;给了我们一个目录,在测试其他时…

[图解]识别类和属性-投资少见效快产量高

1 00:00:00,530 --> 00:00:04,360 接下来&#xff0c;我们就要来识别实体类和属性了 2 00:00:05,670 --> 00:00:07,260 前面也讲了&#xff0c;从哪里识别 3 00:00:08,120 --> 00:00:11,470 从用例规约那里来识别 4 00:00:12,400 --> 00:00:15,770 在识别的时候…

气膜体育馆投资前景广阔:健康产业中的新兴机遇—轻空间

气膜体育馆作为一种新型的建筑形式&#xff0c;为投资者带来了丰富的商业机会。随着全民健身的理念普及&#xff0c;气膜体育馆在市场上逐渐展现出巨大潜力。 市场需求不断增长 随着健康意识提升&#xff0c;人们对运动场地的需求日益增加。气膜体育馆凭借其灵活的建筑形式&…

【线性代数】正定矩阵,二次型函数

本文主要介绍正定矩阵&#xff0c;二次型函数&#xff0c;及其相关的解析证明过程和各个过程的可视化几何解释&#xff08;深蓝色字体&#xff09;。 非常喜欢清华大学张颢老师说过的一段话&#xff1a;如果你不能用可视化的方式看到事情的结果&#xff0c;那么你就很难对这个…

select、poll、epoll的区别

select、poll、epoll均为linux中的多路复用技术。3种技术出现的顺序是select、poll、epoll&#xff0c;3个版本反应了多路复用技术的迭代过程。我们现在开发网络应用时&#xff0c; 一般都会使用多路复用&#xff0c;很少有用一个线程来监听一个fd的&#xff0c;其中epoll又是最…

鸿蒙开发5.0【Picker的受限权限适配方案】

Picker由系统独立进程实现&#xff0c;应用可以通过拉起Picker组件&#xff0c;用户在Picker上选择对应的资源&#xff08;如图片、文档等&#xff09;&#xff0c;应用可以获取Picker返回的结果。 类型受限权限使用的picker音频ohos.permission.READ_AUDIO&#xff0c;ohos.p…

【无人机设计与控制】 四轴飞行器的位移控制

摘要 本文介绍了一种四轴飞行器的位移控制方法&#xff0c;并通过Simulink模型进行仿真和验证。该方法通过PID控制器对飞行器的位移进行精确调节&#xff0c;以实现飞行器在三维空间中的稳定定位和路径跟踪。通过参数调节&#xff0c;能够适应不同的飞行任务需求&#xff0c;确…

UnLua环境搭建

一、环境搭建 1、下载UnLua工程&#xff1a;https://github.com/Tencent/UnLua 2、复制Plugins/UnLua目录下的插件到自己的项目中 3、重新生成自己的VS工程 4、打开VS工程的项目名.Build.cs文件&#xff0c;引用UnLua插件,重新编译工程 PublicDependencyModuleNames.AddRan…

【Nacos】Nacos快速上手使用(注册中心)【详解】

文章目录 1.基本介绍2. 使用Nacos服务注册中心2.1创建Nacos提供者集群 8001&#xff0c;80022.2创建Nacos消费者集群 8887 1.基本介绍 Nacos(Dynamic Naming and Configuration Service)是服务中心的另外一种实现。从注册中心的功能实现角度&#xff0c;与Eureka等价&#xff…

HumanNeRF:Free-viewpoint Rendering of Moving People from Monocular Video 翻译

HumanNeRF&#xff1a;单目视频中运动人物的自由视点绘制 引言。我们介绍了一种自由视点渲染方法- HumanNeRF -它适用于一个给定的单眼视频ofa人类执行复杂的身体运动&#xff0c;例如&#xff0c;从YouTube的视频。我们的方法可以在任何帧暂停视频&#xff0c;并从任意新的摄…

Python批量读取身份证信息录入系统和重命名

前言 大家好&#xff0c; 如果你对自动化处理身份证图片感兴趣&#xff0c;可以尝试以下操作&#xff1a;从身份证图片中快速提取信息&#xff0c;填入表格并提交到网页系统。如果你无法完成这个任务&#xff0c;我们将在“Python自动化办公2.0”课程中详细讲解实现整个过程。…

教师节送什么礼物给老师好 送礼送什么显高档又实用

教师节送什么礼物给老师好 送礼送什么显高档又实用 教师节即将到来&#xff0c;许多学生和家长都在思考如何表达对老师的感激之情。选择一份合适的礼物不仅能够表达心意&#xff0c;还能让老师感受到学生的关心和尊重。那么&#xff0c;送什么礼物给老师既显高档又实用呢&#…

字节跳动笔试题:自动校对程序:解决王大锤的拼写错误

字节跳动面试题:自动校对程序:解决王大锤的拼写错误 引言问题描述数据范围输入输出描述算法与数据结构伪代码C 代码实现代码解释测试用例边界情况复杂度分析结论后记引言 王大锤,一个出版社的编辑,每天面对海量的英文稿件,不胜其烦。然而,凭借他蓝翔技校挖掘机和程序设计…

[情商-13]:语言的艺术:何为真实和真相,所谓真相,就是别人想让你知道的真相!洞察谎言与真相!

目录 前言&#xff1a; 一、说话的真实程度分级 二、说谎动机分级&#xff1a;善意谎言、中性谎言、恶意谎言 三、小心&#xff1a;所谓真相&#xff1a;只说对自己有利的真相 四、小心&#xff1a;所谓真相&#xff1a;就是别人想让你知道的真相 五、小心&#xff1a;所…

Redis 事务:支持回滚吗?深入解析

今天我们要来探讨一个关于 Redis 事务的重要问题&#xff1a;Redis 事务支持回滚吗&#xff1f;这个问题在 Redis 的使用中经常被提及&#xff0c;对于正确理解和使用 Redis 事务至关重要。那么&#xff0c;让我们一起深入解析这个问题吧&#xff01; 一、Redis 事务简介 在了…

Linux命令分享 三 (ubuntu 16.04)

1、‘>’ >>输出重定向 用法&#xff1a;命令 参数 > 文件 ls > a.txt ‘>’ 将一个命令的结果不输出到屏幕上&#xff0c;输出到文件中&#xff0c;如果文件不存在就创建文件&#xff0c;如果存在就覆盖文件。 ls >> a.txt ‘>>’ 如果文件不存…

数据结构与算法02 - 复杂度

1、空间复杂度 空间复杂度指的是临时占用存储空间大小的量度&#xff1b;空间复杂度计算的是变量的个数&#xff0c;也采用大O渐进表示法&#xff1b;由于函数在运行的时候所需要的栈空间&#xff08;存储参数、局部变量、一些寄存器信息等&#xff09;在编译器已经确定好了&a…

BERN2(生物医学领域)命名实体识别与命名规范化工具

BERN2: an advanced neural biomedical named entity recognition and normalization tool 《Bioinformatics》2022 1 摘要 NER和NEN&#xff1a;在生物医学自然语言处理中&#xff0c;NER和NEN是关键任务&#xff0c;它们使得从生物医学文献中自动提取实体&#xff08;如疾病…