收集树中的金币

在这里插入图片描述
提示 1
定义一个点的度数为其邻居个数。如果一个点的度数为 1,那么这个点叫做叶子节点,例如示例 2 的 3,4,6,7 都是叶子节点。

如果叶子节点没有金币,我们有必要移动到叶子节点吗?没有必要。

那么可以先把这些没有金币的叶子节点去掉。如果去掉后又产生了新的没有金币的叶子节点,就继续去掉。

怎么实现?拓扑排序。一开始,把没有金币的叶子节点都加到队列中。然后不断循环直到队列为空。每次循环,弹出队首的节点 x,并删除 x 及其邻居之间的边。我们并不需要实际删除边,只需要把邻居的度数减少 1。如果一个邻居的度数减少为 1 且没有金币,就加到队列中,继续拓扑排序。

提示 2
看示例 2,在去掉节点 6 之后,现在每个叶子节点上都有金币。

由于可以「收集距离当前节点距离为 2 以内的所有金币」,我们没有必要移动到叶子节点再收集,而是移动到叶子节点的父节点的父节点,就能收集到叶子节点上的金币。

那么,去掉所有叶子,然后再去掉新产生的叶子,剩余节点就是必须要访问的节点。

提示 3
由于题目要求最后回到出发点,无论从哪个点出发,每条边都必须走两次。这是因为把出发点作为树根,递归遍历这棵树,那么往下「递」是一次,往上「归」又是一次,每条边都会经过两次。

所以答案就是剩余边数乘 2。当我们删除节点时,也可以看成是删除这个点到其父节点的边。

特别地,如果所有点都要被删除,那么当剩下两个点时,这两个点之间的边我们会删除两次,这会导致剩余边数等于 −1,而此时答案应该是 0。所以最后答案要和 0 取最大值。

vector<int> e[30005];
void add(int a, int b) {e[a].push_back(b);e[b].push_back(a);
}
class Solution {
public:int collectTheCoins(vector<int>& coins, vector<vector<int>>& edges) {int n = coins.size();vector<int> has(n + 1);// 记录是否被删除vector<int> record(n + 1);for (int i = 0; i < n; i++) {e[i].clear();}for (int i = 0; i < edges.size(); i++) {int u = edges[i][0], v = edges[i][1];record[u]++; record[v]++;add(u, v);}queue<int> q;for (int i = 0; i < n; i++) {if (record[i] == 1 && coins[i] != 1) {q.push(i); //cout << i<< " ";}}while (q.size()) {int u = q.front(); q.pop(); //cout << u << " ";if (has[u])  continue;has[u] = 1;for (auto v : e[u]) {record[v]--;if (record[v] == 1 && coins[v] == 0) {q.push(v);}}}// 上面已经对没有用的节点进行了处理for (int i = 0; i < n; i++) {if (coins[i] && record[i] == 1) {q.push(i); //cout << i << " ";}}while (q.size()) {int u = q.front(); q.pop();if (has[u]) continue; //cout << u << " ";has[u] = 1;for (auto v : e[u]) {record[v]--;if (record[v] == 1) {if (v == 2) cout << u;has[v] = 1; //cout << v << " ";} // 没必要再放入队列中}}int ans = 0;for (int i = 0; i < n; i++) {if (!has[i]) {ans++; //cout << i << " ";}}return (ans - 1) * 2;}
};

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

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

相关文章

等保学习干货|等保测评2.0技术中间件自查阶段,零基础入门到精通,收藏这一篇就够了

0x01 前言 以下是根据我国网络安全体系制订的一系列保护流程进行的等级保护测评。该测评针对已有和将上线的业务服务的基础设施&#xff08;系统、数据库、中间件等&#xff09;&#xff0c;执行一系列检查以确保安全合规。本次先行分享学习等保中的技术自查阶段知识&#xff…

Android GreenDao 升级 保留旧表数据

Android GreenDao 升级 保留旧表数据 大川的川关注IP属地: 北京 0.2052019.08.05 11:54:36字数 270阅读 363 瓦力和伊娃 GreenDao升级库版本号之后&#xff0c;以前的旧数据没有了&#xff0c;为啥&#xff0c;因为GreenDao在升级的时候会删除旧库&#xff0c;创建新库&#…

【超详细含图】Ubuntu系统忘记root密码的解决方法

1.启动或者重启Ubuntu长按shift进入grub菜单&#xff1b; 选第二个&#xff0c;按住e进入 2.选择recovery mode进入Recovery Menu界面&#xff0c; 选择root Drop to root shell prompt* 3.修改root密码操作&#xff1a; #passwd 输入新密码&#xff1a;# 再输入一遍密码&…

LLM之本地部署GraphRAG(GLM-4+Xinference的embedding模型)(附带ollma部署方式)

前言 有空再写 微软开源的GraphRAG默认是使用openai的接口的&#xff08;GPT的接口那是要money的&#xff09;&#xff0c;于是就研究了如何使用开源模型本地部署。 源码地址&#xff1a;https://github.com/microsoft/graphrag 操作文档&#xff1a;https://microsoft.git…

springBoot+protobuf(全程Protocol Buffers协议)简单入门

了解Protocol Buffers协议 Protocal Buffers是google推出的一种序列化协议&#xff0c;用于结构化的数据序列化、反序列化。 官方解释&#xff1a;Protocol Buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法&#xff0c;它可用于&#xff08;数据&#xff09;通…

鸿蒙(API 12 Beta2版)NDK开发【使用Node-API接口进行异步任务开发】

使用Node-API接口进行异步任务开发 场景介绍 napi_create_async_work是Node-API接口之一&#xff0c;用于创建一个异步工作对象。可以在需要执行耗时操作的场景中使用&#xff0c;以避免阻塞主线程&#xff0c;确保应用程序的性能和响应性能。例如以下场景&#xff1a; 文件…

入门 PyQt6 看过来(案例)17~ 表格

PyQt6提供了两种用于有规律地呈现更多数据的控件&#xff0c;一种是表格结构的控件(QTableView)&#xff0c;另一种是树形结构的控件(QTreeView)。表格控件属于QTableView类&#xff0c;QTableWidget继承于QTableView。 1 QTableView 表格控件 QTableView控件中QStandItemMod…

IT人求职就业手册:如何在数字时代脱颖而出

&#x1f482; 个人网站:【 摸鱼游戏】【网址导航】【神级代码资源网站】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

【CodinGame】趣味算法(教学用) CLASH OF CODE -20240731

文章目录 正文闰年偶数和密码塔楼高度 写在最后END 正文 闰年 import sys import math# Auto-generated code below aims at helping you parse # the standard input according to the problem statement.a int(input()) b int(input()) count0 for i in range(a, b 1):if…

DELL服务器RAID配置详细教程

DELL服务器RAID配置教程 在启动电脑的时候按CTRLR 进入 RAID 设置见面如下图 名称解释&#xff1a; Disk Group&#xff1a;磁盘组&#xff0c;这里相当于是阵列&#xff0c;例如配置了一个RAID5&#xff0c;就是一个磁盘组 VD(Virtual Disk)&#xff1a; 虚拟磁盘&#xff…

开启智能开发的新纪元:探索 GPT-4o mini 模型的无限可能

引言 随着人工智能技术的飞速发展&#xff0c;大型语言模型已成为推动软件开发和创新的关键力量。OpenAI 最新发布的 GPT-4o mini 模型以其卓越的性能和极具竞争力的价格&#xff0c;为开发者社区带来了新的活力。本文将探讨 GPT-4o mini 模型的特性&#xff0c;以及它如何帮助…

K8S第二节:kubeadm搭建K8s集群

上回书说到什么是K8s&#xff0c;这回就在我自己的虚拟机上搭建一个K8s集群; 一、安装K8S需要的软件包 yum install -y kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1 其中&#xff1a; kubelet:是K8s集群中每个node节点上的管家&#xff0c;用来处理Master节点下发到本节点的…

深入源码:解析SpotBugs (5)BugReportor

常见的 Bug 定位后&#xff0c;通过 bugReport的reportBug&#xff08;BugInstance&#xff09; 方法&#xff0c;将bug 发布出来。 一般的 Detector 经检测后会调用 bugReportor.reportBug 方法或者 BugAccumulator.accumulateBug 。 在GUI中&#xff0c;分析结束后会在下框…

楼宇智能化仿真实训室解决方案

在信息技术的浪潮中&#xff0c;智慧城市作为未来城市发展的新形态&#xff0c;正以前所未有的速度在全球范围内兴起。其中&#xff0c;楼宇智能化作为智慧城市的关键构成&#xff0c;扮演着举足轻重的角色。它不仅提升了建筑的能源效率、安全性与舒适度&#xff0c;还促进了城…

WIFI7:引领智能驾驶新未来

近年来&#xff0c;智能驾驶技术飞速发展&#xff0c;从最初的初级的辅助驾驶逐步迈向高度自动驾驶&#xff0c;这一变化历程深刻依赖的是高效、稳定且前沿的无线通信技术的支撑。WIFI7&#xff0c;作为无线通信领域的最新里程碑&#xff0c;凭借其前所未有的性能提升与功能拓展…

这些才是电脑该装的,5款软件良心且实用,别让它们寒心

为什么别人的电脑&#xff0c;开机无广告&#xff0c;使用0卡顿&#xff0c;下载资源快的飞起&#xff0c;网页就是简洁画面。 而自己的电脑却.....开机超过1%&#xff0c;广告一大堆&#xff0c;下载速度差之千里&#xff0c;网页全是“是兄弟&#xff0c;就来砍我”的船新版…

奥运会被误报的韩国国旗,有多少AI能准确识别?结果出人意料!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

飞创直线模组桁架机械手优势及应用领域

随着工业自动化和智能制造的发展&#xff0c;直线模组桁架机械手极大地减轻了人类的体力劳动负担&#xff0c;在危险性、重复性高的作业环境中展现出了非凡的替代能力&#xff0c;引领着工业生产向自动化、智能化方向迈进。 一、飞创直线模组桁架机械手优势 飞创直线模组桁架…

Spring Boot集成udp通讯

Spring Boot集成udp通讯 加入依赖编辑配置文件配置相关属性具体业务类客户端调试 加入依赖 <!--加入UDP通信所需依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-integration</artifactId&…

【PCB设计原则5】-PCB设计的寄生元件

寄生电容 在PCB上布两条靠近的走线&#xff0c;很容易形成寄生电容。由于这种电容的存在&#xff0c;在一条走线上的快速电压变化&#xff0c;可在另一条走线上产生电流信号。 设计电路板时&#xff0c;放置两条彼此靠近的走线就会产生寄生电容。例如,在不同的两层&#xff0c…