力扣--图论/Prim1584.连接所有点的最小费用

思路分析:

  1. 初始化:获取点的数量,并创建两个辅助数组 adjvexlowcost,分别用于记录最小生成树的边信息和每个顶点到最小生成树的距离。
  2. Prim算法循环:在每一次循环中,选择一个未加入最小生成树的顶点 k,使得从已加入最小生成树的顶点到 k 的距离最小。循环 n-1 次,每次选择一个顶点加入最小生成树。
  3. 找出下一个顶点:遍历所有未加入最小生成树的顶点,选择距离最小的顶点 k,加入最小生成树,并标记顶点 k 已被访问。
  4. 更新最小生成树信息:更新 lowcost 数组,更新每个顶点到最小生成树的距离。
  5. 计算总成本:计算最小生成树的总成本,即所有边的长度之和,并返回。
class Solution {
public:
    int minCostConnectPoints(vector<vector<int>>& points) {
        int n = points.size(); // 获取点的数量

        // 用于存储最小生成树的边信息
        vector<int> adjvex(n, 0); // 记录最小生成树的顶点的下标
        vector<int> lowcost(n, 0); // 记录从最小生成树中的某顶点到其它顶点的最小权值

        // 初始化lowcost数组,将除了第一个点以外的顶点到第一个点的距离记录下来
        for(int i = 1; i < n; i++)
            lowcost[i] = abs(points[i][0] - points[0][0]) + abs(points[i][1] - points[0][1]);

        // 用于记录顶点是否已被访问过
        vector<bool> visited(n, false);

        // Prim算法的主要循环,构建最小生成树
        for(int t = 0; t < n - 1; t++) {
            int k = 1, min = INT_MAX;
            // 找出lowcost数组中的最小值
            for(int i = 1; i < n; i++) {
                if(lowcost[i] < min && visited[i] == false) {
                    min = lowcost[i];
                    k = i;
                }
            }
            // 标记顶点k已被访问
            visited[k] = true;
            // 将k顶点到其它顶点的权值设为0,表示已加入最小生成树
            lowcost[k] = 0;
            // 更新lowcost数组中的值
            for(int i = 1; i < n; i++) {
                if(i != k) {
                    // 计算顶点i到顶点k的距离
                    int close = abs(points[i][0] - points[k][0]) + abs(points[i][1] - points[k][1]);
                    // 如果顶点i到顶点k的距离小于当前到顶点i的最小权值,则更新相应信息
                    if(lowcost[i] > close) {
                        adjvex[i] = k;
                        lowcost[i] = close;
                    }
                }
            }
        }

        // 计算最小生成树的总成本
        int num = 0;
        for(int i = 0; i < n; i++) {
            num += abs(points[i][0] - points[adjvex[i]][0]) + abs(points[i][1] - points[adjvex[i]][1]);
        }
        // 返回最小生成树的总成本
        return num;
    }
};

相关推荐

  1. -1984. 学生分数差值

    2024-04-14 23:46:02       30 阅读
  2. -

    2024-04-14 23:46:02       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-14 23:46:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-14 23:46:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-14 23:46:02       82 阅读
  4. Python语言-面向对象

    2024-04-14 23:46:02       91 阅读

热门阅读

  1. 华为OD-C卷-最长子字符串的长度(一)[100分]

    2024-04-14 23:46:02       28 阅读
  2. IP协议

    IP协议

    2024-04-14 23:46:02      31 阅读
  3. UE5+GIS技术应用场景介绍

    2024-04-14 23:46:02       33 阅读
  4. 7天八股速记之C++后端——Day 2

    2024-04-14 23:46:02       30 阅读
  5. leetcode热题HOT 207. 课程表(拓扑排序)

    2024-04-14 23:46:02       40 阅读
  6. 树莓派4B开发板安装Anaconda虚拟环境

    2024-04-14 23:46:02       34 阅读
  7. 博士找教职--经验贴

    2024-04-14 23:46:02       31 阅读
  8. 【备忘】composer国内镜像列表

    2024-04-14 23:46:02       37 阅读
  9. Linux下静态库与动态库使用总结

    2024-04-14 23:46:02       36 阅读