牛客oj 习题11.6最短路径(并查集+Dijkstra+大数加乘比较)

该博客介绍了如何利用并查集优化解决一道数据规模极大的最短路径问题,通过Dijkstra算法结合大数加法、乘法和比较来处理超大数值。博主分享了在实现过程中遇到的挑战,包括大数比较的错误以及对于取模运算的思考,认为直接对边的输入取模可能导致无法正确比较距离。虽然一些解法没有使用大数运算也过了测试,但博主认为这可能得益于弱测试数据。总的来说,此题加深了对并查集应用的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

题目链接:click here

题意:中问题,数据非常大

思路:

(1)、由于后输入的边一定要大于之前所有边的总和,所以用并查集解决多余边问题,若输入边的两点不在同一集合,则合并,代表这个集合内的边都是尽可能小的边,若输入边的两点已经在同一集合,则将边舍弃;

(2)、使用Dijkstra算法解决最短路问题,由于输入数据太庞大,所以用字符串存储以及运算,这里用到了大数加法、乘法、比较;

(3)、将求得的字符串转化为整形数字并输出后5位。

PS:这题昨天写了我一天,练到了好多知识点(并查集属于优化范畴)。越长的代码越是能锻炼自己的代码能力,也值了。只是这题因为不会改bug也看了些题解,其中有些人只用并查集+最短路没用大数就过去了,他们大多在输入边的时候就对100000取了模,我认为这样想是错误的。题目中说数值太大的以MOD 100000 的结果输出,没说输入的边太大就模100000,而且不管floyd还是dijkstra都要比较距离值,取模后很显然无法正确比较。然而他们还是过了,我认为是数据还是弱,弱到边的大小在小于100000的时候就全将节点合并,以至于后面大于100000的边都舍去,导致结果依然不变,但这并不能说明这题解答正确。

再PS:大数比较函数一开始写居然写成了从低位比到高位,一度改代码改到绝望半天才找出问题,总体来说这题体验不错。

 

 

#include <cstdio>
#include <iostream>
#include <algorith
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值