贪心法——最小生成树

news2024/9/23 13:25:10

问题描述:

最小生成树
Time Limit: 2000 MSMemory Limit: 5000 KB

Description

给定n(n<=500)个顶点,以及E(E<=20000)条边,计算最小生成树的权值.

Input

第一行输入T表示有T组数据。每组数据第一行输入n、E,分别表示顶点数和边数. 接下来
输入E行每行三个正整数u(1<=u<=n)、v(1<=v<=n)、w,表示顶点u到顶点v之间无向边
长度w(可能有重边)。

Output

输出T行正整数,第i行表示第i组数据的最小生成树权值, 若不能构建最小生成树输出-1。

Sample Input

3
2 2
1 2 1
1 2 2
3 1
2 3 1
3 3
1 2 2
1 2 3
2 3 1

Sample Output

1
-1
3

思路分析:

prim (普里姆算法)

prim算法基于贪心,我们每次总是选出一个离生成树距离最小的点去加入生成树,最后实现最小生成树(不做证明,理解思想即可) 

 

 kruskal (克鲁斯卡尔算法)(也是贪心法)

此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。 
1. 把图中的所有边按代价从小到大排序; 
2. 把图中的n个顶点看成独立的n棵树组成的森林; 
3. 按权值从小到大选择边,所选的边连接的两个顶点ui,vi,应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。 
4. 重复(3),直到所有顶点都在一颗树内或者有n-1条边为止。
 

代码实现:

prim (普里姆算法)

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;

const int MAXN = 505;
const int MAXE = 20005;
const int INF = 0x3f3f3f3f;

struct Edge {
    int v, w;
    Edge(int v, int w) : v(v), w(w) {}
};

vector<Edge> G[MAXN];
int dis[MAXN];      // dis[i]表示顶点i到生成树的距离
bool vis[MAXN];     // vis[i]表示顶点i是否已加入生成树

int Prim(int n) {
    int ans = 0;
    memset(dis, INF, sizeof(dis));
    memset(vis, false, sizeof(vis));
    dis[1] = 0;     // 从顶点1开始构建生成树
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push(make_pair(0, 1));
    while (!pq.empty()) {
        int u = pq.top().second;
        pq.pop();
        if (vis[u]) continue;
        vis[u] = true;
        ans += dis[u];
        for (int i = 0; i < G[u].size(); i++) {
            int v = G[u][i].v;
            int w = G[u][i].w;
            if (!vis[v] && w < dis[v]) {
                dis[v] = w;
                pq.push(make_pair(dis[v], v));
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        if (!vis[i]) {
            return -1;  // 有顶点不在生成树中,说明无法构建最小生成树
        }
    }
    return ans;
}

int main() {
    int T;
    cin >> T;
    while (T--) {
        int n, m;
        cin >> n >> m;
        for (int i = 1; i <= n; i++) {
            G[i].clear();
        }
        for (int i = 1; i <= m; i++) {
            int u, v, w;
            cin >> u >> v >> w;
            G[u].push_back(Edge(v, w));
            G[v].push_back(Edge(u, w));
        }
        int ans = Prim(n);
        cout << ans << endl;
    }
    return 0;
}

运行结果:

Prim算法

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/488691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年度国家自然科学基金项目申请初审结果公布~

2023年4月28日&#xff0c;国家自然科学基金委员会发布了《关于公布2023年度国家自然科学基金项目申请初审结果的通告》&#xff0c;2023年度国家自然科学基金项目申请初审结果公布&#xff01;2023年度项目申请集中接收期间&#xff0c;自然科学基金委共接收各类型项目申请304…

8年测试经验分享,15K的测试工程师需要掌握那些知识?

软件测试行业是随着软件产业的发展而兴起的一个重要领域&#xff0c;目前处于快速发展阶段。以下是软件测试行业的现状&#xff1a; 人才需求增长&#xff1a;随着互联网、移动互联网、物联网等新技术的不断发展&#xff0c;软件测试人才需求呈现出快速增长的趋势。越来越多的…

找高清无水印视频素材,就上这9个网站。

推荐几个我的视频素材库&#xff0c;有免费、收费、商用&#xff0c;希望对大家有帮助&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库可以找到设计、办公、图片、视频、音频等各种素材。视频素材就有上千个&#xff0c;全部都很高清&…

20.考虑用户舒适度的冷热电多能互补综合能源系统优化调度

说明书 MATLAB代码&#xff1a;考虑用户舒适度的冷热电多能互补综合能源系统优化调度 关键词&#xff1a;用户舒适度 综合能源 PMV 优化调度 参考文档&#xff1a;《冷热电气多能互补的微能源网鲁棒优化调度》基础模型加舒适度部分模型&#xff1b; 仿真平台&#xff1a;MA…

IBM停止招聘可被AI取代的职位;三星禁止员工使用ChatGPT;印象笔记官方AI免费课;清华美院AI绘画的高质量分享 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『IBM将停止招聘可被人工智能取代的职位』近8000名工人将被自动化取代 据彭博社报道&#xff0c;IBM首席执行官Arvind Krishna表示&am…

三、信号槽

三、信号槽 1.概念&#xff1a; 信号槽指的是信号函数与槽函数的连接&#xff0c;可以使用不同的对象通过信号槽连接在一起&#xff0c;从而实现对象之间的通信。 信号槽认为是对象之间的一种约定&#xff1a;如果.......&#xff0c;则....... 信号槽是Qt新增的特性&#xff…

五一2.74亿人倾巢而出,小长假到底去哪玩儿?

今天是五一劳动节小长假结束后&#xff0c;打工人上班的第一天。 今年的五一非比寻常&#xff0c;是三年口罩之后的第一个小长假&#xff0c;回家探亲的回家、出门玩的出门&#xff0c;据统计&#xff0c;今年五一劳动节5天小长假&#xff0c;累计有2.74亿人次在国内出游&…

Redis-周阳(17. Redis 分布式锁)学习笔记

上一篇 &#xff1a; 16.短信验证码 文章目录 1. 相关面试题2. Redis 搭建3. 编码实现分布式锁3.1 建 Model3.2 改 POM3.3 写 YML3.4 主启动3.5 业务类3.6 小测试 4. 上述案例存在问题及修改4.1 没有加单机版的锁4.2 分布式部署之后&#xff0c;单机版的锁失效4.3 出现异常时&a…

使用iServer的Web打印功能打印临时图层tempLayersSet资源

作者&#xff1a;Carlo 背景&#xff1a;最近很多小伙伴想要了解如何将临时图层资源打印输出为图片&#xff1f;其实&#xff0c;官网已发布的10.2.1版本以及11.1.0版本的iServer就已经支持该功能&#xff0c;我们可以通过下文的介绍来学习使用。 步骤一、生成一个临时图层资源…

【C生万物】 结构体篇

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; &#x1f449; 专栏&#xff1a;《C生万物 | 先来学C》&#x1f448; 前言&#xff1a; 这期继续C语言的学习&#xff0c;进行结构体的讲解&#xff0c;值得注意的是&#xf…

Java版企业电子招标采购系统源代码Spring Boot + 二次开发 + 前后端分离 构建企业电子招采平台之立项流程图

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…

SpringCloud------Eureka集群版整合生产(集群)以及消费(五)

SpringCloud------Eureka集群版整合生产以及消费&#xff08;五&#xff09; 集群避免单点故障的发生。 服务注册&#xff1a; 将服务信息注册进服务中心 服务发现&#xff1a; 从注册中心上获取服务信息 实质&#xff1a;存key服务名&#xff0c;取value调用地址 1.先启动eur…

STM32-IAP基本原理及应用 | ICP、IAP程序下载流程 | 程序执行流程 | 配置IAP到STM32F4xxx

目录 1.串口IAP介绍1.1STM32编程方式1.2STM32系列芯片系统存储器区域1.2.1 STM32F40x/41x1.2.2 STM32F42x/43x 1.3STM32启动模式选择1.4ICP下载流程1.5IAP下载流程1.6一般的程序执行流程1.7加入IAP之后程序运行程序1.8STM32复位后如何跳转到main函数1.9IAP升级应用程序过程 2.A…

复合查询 --- MySQL总结(三)

复合查询 文章目录 复合查询多表查询自连接子查询单行查询多行查询多列子查询合并查询 表内连和外连内连外连 多表查询 前面讲述的关于进行一个表的简单查询和关于时间函数的相关问题&#xff0c;下面要进行复合查询的相关内容。 这里要使用卡笛尔集的概率让两个表融合成为一个…

美国第十次加息 正面临史上最严重的债务危机 经济形势堪忧

美联储周三如期宣布加息25个基点&#xff0c;将联邦基金利率目标区间上调到5%至5.25%之间&#xff0c;这已是美联储自去年3月以来的第十次加息。 FOMC在声明中强调&#xff0c;美国第一季度经济活动温和扩张&#xff0c;近几个月新增就业岗位强劲&#xff0c;失业率依然处于低位…

WxGL应用实例:绘制点云

WxGL附带了几个工具函数&#xff0c;其中read_pcfile用来解析.ply和.pcd格式的点云文件&#xff0c;该函数返回一个PointCloudData类实例&#xff0c;包含以下属性&#xff1a; PointCloudData.ok - 数据是否可用&#xff0c;布尔型PointCloudData.info - 数据可用性说明&…

Vue 面试题汇总

前言 面试题整理自 Vue面试专题&#xff0c;题解结合了个人的思考和理解&#xff0c;供大家参考。 个人觉得村长的题目选的都挺好的&#xff0c;而且题解也很全面&#xff0c;就是题解比较书面&#xff0c;大家实际面试的时候可以尽量口语化&#xff0c;按照答题思路组织语言…

BadUsb使用

1 IDE下载 地址&#xff1a;Software | Arduino 2 开发版驱动安装 linux和mac版本会自动识别提示你安装开发板&#xff0c;驱动貌似不需要额外安装 win需要根据板子型号去下载安装驱动 如 Arduino驱动的安装教程-DFRobot产品资料库 默认会提示你根据你插入的设备进行提示…

C++ 中的引用

引用 变量名&#xff0c;本身是一段内存的引用&#xff0c;即别名(alias).引用可以看作一个已定义变量的别名 引用的语法: Tvpe& name var&#xff1b; 类型& 引用变量名称 变量名称 这就是引用变量的定义。&和类型结合称之为引用符号&#xff0c;不是取…

【一起啃书】《机器学习》第六章支持向量机

文章目录 第六章 支持向量机6.1 间隔和支持向量6.2 对偶问题6.3 核函数6.4 软间隔与正则化6.5 支持向量回归6.6 核方法6.7 一些问题 第六章 支持向量机 6.1 间隔和支持向量 给定训练样本集 D { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } , y i ∈ { − 1 , …