PRIME:
1.Q:什么情况下选用prime版本的最小生成树?
ans: 当题目中输入的是矩阵的时候,选用pirme,而prime代码的核心部分是
迪杰的朴素版本,迪杰的朴素版本就是用邻接矩阵存图的。
2.Q:题目中提到对称矩阵意味着什么?
ans:意味着边是无向边。
3.Q: prime()算法模板是在迪杰的基础上改了什么?
ans: ①多了个res=0,统计最小生成树的边数。
②多了个判定什么情况下最小生成树不连通,也就是无解
③多了个 return res
KRUSKAL:
1.Q:什么情况下选用kruskal版本的最小生成树?
ans:
1.当题目是要用最小生成树来做,但是并没有说 给出的所有点是联通的,
这就说明不是 一个整体联通, 而是多个联通块的情况
对于prime()来说:
弊端很明显,它每次都是一个点向与它联通的所有点扩展,
如果要处理多个联通块的话,就要多次调用 prime()算法。
对于kruskal()来说:
多个联通块独立地求最小生成树,一点问题都没有,就是求一个
“最小生成森林”而已。
2.当我们不再是求总边权最小的生成树,而是求最大边权最小的生成树。
(kruskal算法天生自带二分,就不用写二分了)
acwing1142 繁忙的都市
3.kruskal天生自带二分,
acwing 1145北极通讯网络
首先这题的最终结果不是一整棵树,而是多个联通块,这一点说明了可以用 kruskal算法
其次这题要用到二分d的最小值,同时d又是联通块中边权的最大值,
也就是d是最小的最大值,这点与2一样了
但是本题不会像2.一样0~n-1进行到底,而是会中途break (核心就在于这个break)
也就是不会形成一个完整最小生成的树
而是多个联通块。
这个break保证了 卫星设备k个够用
2.Q:使用kruskal()算法要注意什么?
ans:要注意,存边是用struct Node 来存,并且要在里面重载"<",
因为按照边长从小到大排序
核心部分如下:
每次取出一个边,提取出起点和终点