最小生成树

本文探讨了如何优化Kruskal算法,以解决图论问题中的最小生成树。通过减少无向图中边的构建次数和使用排序替代优先队列,显著减少了算法的运行时间。具体优化包括:仅建立单向边,降低建边的常数时间,以及使用sort函数一次完成排序,减少每次pop操作的时间复杂度。这些改进将原本可能导致超时的算法优化至通过测试用例。
摘要由CSDN通过智能技术生成

Kruskal的优化:
Highways 这题为例
思路,点之间两两建边,利用kruskal和并查集,先连上已有的边(将边的两个端点放入一个并查集中),再将不同集合的边连接直到边数等于n
做题过程1:结构体2个(Point记录点坐标,Edge记录每条边的情况),优先队列(至今为止Kruskal用的好像都是这个?,每两个点之间建边,但是跳过在同意集合的两个点。其中建边的时间复杂度是O(n^2),KruskalO(nlogn),怎么看都不会超时的情况下,还是因为常数过大TLE了(黄色部分仍可优化)
每两个点之间建边for(int i = 1->n),for(int j = 1-> n)->for(int i = 1->n),for(int j = i + 1 ->n),虽然是无向图,但可只建立单向边缩短常数时间(538ms)
优先队列->sort:优先队列每进行一次pop()操作都要logn的时间,而sort总共只需一次logn的时间(538ms->254ms)
总结:1:保证答案正确的情况下,尽量建更少的边
2:用sort代替priority_queue

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值