2.3-? 完成最小生成树专题
(还没做完)
题目链接
概述
最小生成树(MST)的算法主要有两种,prim和kruscal。
prim算法,从任意一个顶点开始,每一次在所有连接已访问顶点和未访问顶点的边中中最小的那条,将其中未访问的那个顶点加入已访问节点集中,并记录边长;循环直至所有顶点被访问,边长总合即为最小生成树的总长。
kruscal算法,基于并查集,将所有边升序排序,所有顶点视为一个并查集。遍历所有边,当一条边的两个顶点不在同一个并查集中时,将两个并查集合并,记录边长。(若所有边遍历完还有两个顶点不在同一并查集,那么原图不是连通图)边长总合即为最小生成树的总长。
题解
prim
用模板轻松解决A,B,C,E,H,K,L,M(E题TLE了)
kruscal
用模板轻松解决D,F,G(G题MLE了)
I
先BFS搜索出各个外星人(包括S,也看作外星人中的一员)两两间的距离,再使用最小生成树。结果MLE了。
J
唯一最小生成树。基于kruscal算法。
考虑运算完x条边后的k条长度同为l的边(前x条边长均比l小),若边本身已经在同一个并查集,则可以自动忽略;否则,如果有其中k条边能合并同k个并查集,那么这个最小生成树是不唯一的。
下面是具体步骤:
将边升序排序,遍历。记录上一个加入最小生成树的边的大小prev,以及加入该边之前并查集数组的数据,记作oldp。当前的并查集数组名为newp。
对于每一条边,有下列可能:
- 若该边大于prev,那么prev长度的边不可能引起多个最小生成树。更新oldp和prev。若该边的两个顶点不在同一并查集内,合并这两个并查集。
- 若当前边等于prev,且该边的两个顶点已经在oldp的同一个并查集中,那么继续循环;
- 若当前边等于prev,且该边的两个顶点不在newp的同一个并查集中,那么合并这两个并查集,并继续循环;
- 若当前边等于prev,且该边的两个顶点在newp的同一个并查集中,但是不在oldp的同一个并查集中,那么会引起多个可能的最小生成树,直接结束函数返回-1;
若没有多个可能,返回最小生成树总长。最后按要求输出即可。