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/ 写这篇文章是为了记录此次最小生成树的学习。

其实最小生成树的本质应该也是贪心算法,他始终是用当前权值最短的边去判断的。

posted @ 2021-01-19 20:18  苏州の酱醋茶  阅读(75)  评论(0编辑  收藏  举报