zoukankan      html  css  js  c++  java
  • 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/ 写这篇文章是为了记录此次最小生成树的学习。

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

  • 相关阅读:
    设计模式之 原型模式
    设计模式之 策略模式
    设计模式之 单例模式
    使用IntelliJ IDEA 15和Maven创建Java Web项目(转)
    Java 内存分配全面浅析(转)
    java常量池概念 (转)
    java基本类型和包装类的区别(转)
    JAVA数据类型(转)
    SQL SERVER 2008 服务器登录名、角色、数据库用户、角色、架构的关系(转)
    视图的好处(转)
  • 原文地址:https://www.cnblogs.com/jyj666/p/14299807.html
Copyright © 2011-2022 走看看