小美的修路(最小生成树练习)

news2024/12/27 13:11:14

本题链接:登录—专业IT笔试面试备考平台_牛客网

题目:

样例:

输入
3 4
1 2 3 1
1 2 2 0
1 3 1 0
2 3 3 0
输出
2
1 3

思路:

        由题意,这里建造的城市需要修路,且每个城市之间可以联通,且 是 1 的标记,一定有该方案,0 可自主选择该修路方案,问最少花费修路费用,。

根据题干 ‘每个城市之间可以联通’ 相当于 每个结点都需要遍历一遍,这个修路,就是边权。

这里只是多了一个 标记需要优先选择,根据数据范围,我们还是用 Kruskal 算法即可。

代码详解如下:

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#define endl '\n'
#define YES puts("YES")
#define NO puts("NO")
#define umap unordered_map
#define All(x) x.begin(),x.end()
#pragma GCC optimize(3,"Ofast","inline")
#define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;

int n,m;

struct Edge
{
	int a,b,w,p,id;
	// 定义排序规则,标记 1 的为优先选择方案
	// 之后排序 最小花费的边权为 优先可选择的方案
	inline bool operator<(const Edge&t)const
	{
		if(p != t.p) return p > t.p;
		return w < t.w;
	}
}edge[N];

umap<int,int>r;	// 存储集合所对应的连接点

// 查找对应的城市 根节点函数
inline int Find(int &x)
{
	int t = x;
	while(x != r[x]) x = r[x];
	r[t] = x;
	return x;
}

vector<int>plan;
inline bool Kruskal()
{
	// 排序好优先选择的方案
	sort(edge + 1,edge + m + 1);
	
	// 初始化城市点的根节点为自身
	for(int i = 0;i <= n;++i) r[i] = i;
	
	int cnt = 0;	// cnt 用于记录修路的数量
	// 遍历所有方案
	for(int i = 1;i <= m;++i)
	{
		// 获取需要修路的对应两个城市
		int a = edge[i].a;
		int b = edge[i].b;
		
		// 查找对应两个城市的根节点
		a = Find(a),b = Find(b);
		
		if(edge[i].p || a != b)
		{
			// 如果这两个城市之间没有连接过
			// 或者它们是必选方案,那么将它们连接起来
			r[a] = b;
			// 累加方案数
			plan.emplace_back(edge[i].id);
			++cnt;	// 累加可以修的路数量
		}
	}
	// 如果所修的路无法将所有城市联通,返回 false
	if(cnt < n - 1) return false;
	return true;	// 否则返回 true
}

// 打印方案数函数
inline void PrintPlan()
{
	cout << plan.size() << endl;
	for(int i : plan)
	{
		cout << i << ' ';
	}
}

inline void solve()
{
	// 输入各个信息
	cin >> n >> m;
	for(int i = 1;i <= m;++i)
	{
		int a,b,w,p;
		cin >> a >> b >> w >> p;
		// 存储好方案
		edge[i] = {a,b,w,p,i};
	}
	
	// 开始克鲁斯卡尔算法,判断是否有解,并输出对应答案
	if(Kruskal()) PrintPlan();
	else puts("-1");
}

int main()
{
//	freopen("a.txt", "r", stdin);
	IOS;
	int _t = 1;
//	cin >> _t;
	while (_t--)
	{
		solve();
	}

	return 0;
}

最后提交:

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

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

相关文章

网络协议--TCP的成块数据流

20.1 引言 在第15章我们看到TFTP使用了停止等待协议。数据发送方在发送下一个数据块之前需要等待接收对已发送数据的确认。本章我们将介绍TCP所使用的被称为滑动窗口协议的另一种形式的流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必…

安卓APP抓包环境配置

软件下载安装 所需软件 夜神模拟器 Fiddler platform-tools 下载地址 https://wwb.lanzoum.com/b01xhmk5e 密码:hv99 配置Fiddler 由于fiddler只默认抓取HTTP的请求&#xff0c;若想抓取HTTPS的请求&#xff0c;则需要设置HTTPS的各项值 设置HTTPS各项值 在fiddler菜单项…

思维模型 棘轮效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。由俭入奢易&#xff0c;由奢入俭难&#xff0c;到底因为啥&#xff1f;棘轮效应。 1 棘轮效应的应用 1.1 恋爱中的棘轮效应 小美是一个漂亮的女孩&#xff0c;家庭条件也不错&#xff0c;…

R2R 的一些小tip

批次间控制器(Run-to-run Controller)&#xff0c;以应对高混合生产的挑战。将最优配方参数与各种工业特征相关联的模型是根据历史数据离线训练的。预测的最优配方参数在线用于调整工艺条件。 批次控制(R2R control)是一种先进的工艺控制技术&#xff0c;可在运行(如批次或晶圆…

网络滤波器/网络滤波器/脉冲变压器要怎样进行测试,一般要测试哪些参数?

Hqst华强盛导读&#xff1a;网络滤波器/网络滤波器/脉冲变压器要怎样进行测试&#xff0c;一般要测试哪些参数&#xff1f;测试网络滤波器的测试方法和步骤如何&#xff0c;需用到哪些测试工具和仪器设备呢&#xff1f; 一&#xff0c;网络流量的监控和过滤能力测试&am…

教你自己动手搭建一个传奇游戏,自己和自己玩,找找当年的感觉

传奇游戏承载了一代人的青春记忆。在那个年代&#xff0c;很多人都会在网吧里玩传奇游戏&#xff0c;与朋友一起组队打怪、刷装备。这些经历不仅让很多8090终生难忘&#xff0c;也成为了我们青春岁月中最珍贵的回忆。 虽然现在的传奇游戏已经逐渐淡出了人们的视线&#xff0c;…

C++: 类和对象(上)

文章目录 1. 面向对象和面向对象初步认识2. 类的引入3. 类的访问限定符4. 类的定义类的两种定义方式成员变量名规则的建议 5. 类的作用域6. 类的实例化7. 类对象模型计算类对象的大小 类的实际存储方式 8. this指针this指针的引入this指针的特性 1. 面向对象和面向对象初步认识…

c++指针【1】

在C中&#xff0c;指针是一种特殊的变量&#xff0c;它存储了一个内存地址。C指针在处理内存、数组、函数参数传递、文件I/O、动态内存分配等方面有着重要的应用。 一个指针变量通常被声明为特定类型的指针。例如&#xff0c;一个整数类型的指针可以指向一个整数。在声明指针变…

【软考】13. 结构化开发方法

《系统分析与设计概述》 当前系统的物理模型 ——> 当前系统的逻辑模型 ——> 目标系统的逻辑模型 ——> 目标系统的物理模型系统开发的目的&#xff1a;当前系统的物理模型 ——> 目标系统的物理模型 系统设计基本原理 抽象、模块化&#xff08;逐步分解&#xf…

「网络编程」数据链路层协议_ 以太网协议学习

「前言」文章内容是数据链路层以太网协议的讲解。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、以太网协议简介二、以太网帧格式&#xff08;报头&#xff09;三、MTU对上层协议的影响四、ARP协议4.1 ARP协议的作用4.2 ARP协议报头 一、以太网协…

【Spring】IOC快速入门

文章目录 1. Spring简介2. IOC快速入门 1. Spring简介 Spring是一个开放源代码的Java SE/EE一站式轻量级开源框架&#xff0c;由Rod Johnson发起并创立。其核心是IOC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09;&#xff0c;使得开发者可以将对…

『 C++类与对象』继承

文章目录 继承的概念继承方式与访问限定符基类和派生类对象赋值转换继承中的作用域隐藏 派生类的默认成员函数构造函数拷贝构造函数赋值运算符重载析构函数 继承与友元静态成员与继承关系 继承的概念 继承的机制为,允许在以该类为基础上对类进行扩展,增加功能; 通常原来也就是…

社区买菜系统 JAVA开源项目

目录 项目内容 项目获取 项目截图 项目内容 基于VueSpringBootMySQL的社区买菜系统&#xff0c;包含菜品分类模块、菜品档案模块、菜品订单模块、菜品收藏模块、收货地址模块&#xff0c;还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、…

【网安AIGC专题10.19】论文6:Java漏洞自动修复+数据集 VJBench+大语言模型、APR技术+代码转换方法+LLM和DL-APR模型的挑战与机会

How Effective Are Neural Networks for Fixing Security Vulnerabilities 写在最前面摘要贡献发现 介绍背景&#xff1a;漏洞修复需求和Java漏洞修复方向动机方法贡献 数据集先前的数据集和Java漏洞Benchmark数据集扩展要求数据处理工作最终数据集 VJBenchVJBench 与 Vul4J 的…

Unity编辑器扩展之CustomPropertyDrawer理解

一、引言&#xff0c; 在上一篇文章中提到&#xff0c;CustomEditor只能自定义单一类&#xff0c;被其他类持有的类自定义没有作用&#xff0c;这个时候就需要使用CustomPropertyDrawer属性。 二、PropertyDrawer介绍 PropertyDrawer用于自定义属性绘制器的基类。使用Proper…

【办公自动化】wps word首字下沉/文字宽度/段落底纹/图片缩放/装订线(Word的相关操作)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

『第九章』雨燕新量子引擎:结构化并发

在本篇博文中,您将学到如下内容: 1. 千呼万唤始出来:结构化并发2. async/await3. “结构化(structured)”到底是个神马?3.1 async let3.2 TaskGroup4. 非结构化并发(unstructured concurrency)4.1 非异步上下文中的 Task4.2 Detached Task4.3 延时5. 任务(Task)的取消和…

168. Excel表列名称

168. Excel表列名称 Java代码&#xff1a; 26进制&#xff0c;但是每个进制是从1开始的&#xff0c;不是从0开始&#xff1b;因此要计算要构建从0开始的求余&#xff01; class Solution {public String convertToTitle(int cn) {StringBuilder sb new StringBuilder();whi…

ElasticSearch快速入门实战

全文检索 什么是全文检索 全文检索是一种通过对文本内容进行全面索引和搜索的技术。它可以快速地在大量文本数据中查找包含特定关键词或短语的文档&#xff0c;并返回相关的搜索结果。全文检索广泛应用于各种信息管理系统和应用中&#xff0c;如搜索引擎、文档管理系统、电子…