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