leetcode1584. 连接所有点的最小费用(最小生成树算法的应用)
public class Solution { public int MinCostConnectPoints(int[][] points) { if (points.Length <= 1) { return 0; }
//这边dictionary中key的二元组分别是指两个点即这条边的两个点分别在points数组中的一维下标 var dictionary = new Dictionary<(int, int), int>(); for (var i = 0; i < points.Length; i++) { for (int j = i + 1; j < points.Length; j++) { dictionary[(i, j)] = Math.Abs(points[i][0] - points[j][0]) + Math.Abs(points[i][1] - points[j][1]); } } var pairs = dictionary.OrderBy(it => it.Value).ToList(); HashSet<int> set = new HashSet<int>() {pairs[0].Key.Item1}; var sum = 0;
//看所有的点是否遍历完全 while (set.Count < points.Length) { foreach (var pair in pairs) {
//这个判断是用于检查两个点是否联通 if ((set.Contains(pair.Key.Item1) && !set.Contains(pair.Key.Item2)) || (set.Contains(pair.Key.Item2) && !set.Contains(pair.Key.Item1))) {
//如果不连通,则加入当前值(因为此时值已经被事先排过序) sum += pair.Value; set.Add(pair.Key.Item1); set.Add(pair.Key.Item2); break; } } } return sum; } }
代码是借鉴的评论区一位老哥的老哥主页如下:https://leetcode-cn.com/u/wuxie0ne/ 写这篇文章是为了记录此次最小生成树的学习。
其实最小生成树的本质应该也是贪心算法,他始终是用当前权值最短的边去判断的。