当前位置: 首页 > news >正文

leetcode 3600. 升级后最大生成树稳定性 困难

给你一个整数n,表示编号从 0 到n - 1n个节点,以及一个edges列表,其中edges[i] = [ui, vi, si, musti]

  • uivi表示节点uivi之间的一条无向边。
  • si是该边的强度。
  • musti是一个整数(0 或 1)。如果musti == 1,则该边必须包含在生成树中,且不能升级

你还有一个整数k,表示你可以执行的最多升级次数。每次升级会使边的强度翻倍,且每条可升级边(即musti == 0)最多只能升级一次。

一个生成树的稳定性定义为其中所有边的最小强度。

返回任何有效生成树可能达到的最大稳定性。如果无法连接所有节点,返回-1

注意:图的一个生成树spanning tree)是该图中边的一个子集,它满足以下条件:

  • 将所有节点连接在一起(即图是连通的)。
  • 形成任何环。
  • 包含恰好n - 1条边,其中n是图中节点的数量。

示例 1:

输入:n = 3, edges = [[0,1,2,1],[1,2,3,0]], k = 1

输出:2

解释:

  • [0,1]强度为 2,必须包含在生成树中。
  • [1,2]是可选的,可以使用一次升级将其强度从 3 提升到 6。
  • 最终的生成树包含这两条边,强度分别为 2 和 6。
  • 生成树中的最小强度是 2,即最大可能稳定性。

示例 2:

输入:n = 3, edges = [[0,1,4,0],[1,2,3,0],[0,2,1,0]], k = 2

输出:6

解释:

  • 所有边都是可选的,且最多可以进行k = 2次升级。
  • 将边[0,1]从 4 升级到 8,将边[1,2]从 3 升级到 6。
  • 生成树包含这两条边,强度分别为 8 和 6。
  • 生成树中的最小强度是 6,即最大可能稳定性。

示例 3:

输入:n = 3, edges = [[0,1,1,1],[1,2,1,1],[2,0,1,1]], k = 0

输出:-1

解释:

  • 所有边都是必选的,构成了一个环,这违反了生成树无环的性质。因此返回 -1。

提示:

  • 2 <= n <= 10^5
  • 1 <= edges.length <= 10^5
  • edges[i] = [ui, vi, si, musti]
  • 0 <= ui, vi < n
  • ui != vi
  • 1 <= si <= 105
  • musti01
  • 0 <= k <= n
  • 没有重复的边。

分析:用 krustral 算法,在包含所有 must=1 的边的情况下,建立最小生成树。对于树中所有的边,把边权最小的 k 条边边权乘以 2,再把操作后最小的边权作为答案返回即可。

class Solution { public: typedef struct node { int u,v,s,must; bool operator<(const node& other)const { return s<other.s; // 按 s 从小到大排序 } }node; int find_father(int v,int father[]) { if(father[v]!=v) { int f=find_father(father[v],father); father[v]=f; return f; } return father[v]; } void merge(int u,int v,int father[]) { int father_u=find_father(u,father),father_v=find_father(v,father); if(father_u==father_v)return; else { father[father_u]=father_v; father_u=find_father(u,father); } } static bool cmp(const node& a,const node& b) { return a.s>b.s; } int maxStability(int n, vector<vector<int>>& edges, int k) { int cnt=0,ret=0x7fffffff,father[n+5]; for(int i=0;i<=n;++i)father[i]=i; priority_queue<node>vec; vector<node>maps; for(int i=0;i<edges.size();++i) { if(edges[i][3]==1) { if(find_father(edges[i][0],father)==find_father(edges[i][1],father)) return -1; merge(edges[i][0],edges[i][1],father); ret=min(ret,edges[i][2]),cnt++; } else { node temp;temp.u=edges[i][0],temp.v=edges[i][1],temp.s=edges[i][2],temp.must=edges[i][3]; vec.push(temp); // maps.push_back(temp); } } if(cnt==n-1)return ret; if(cnt>n-1||(cnt<n-1&&vec.size()==0))return -1; while(cnt<n-1&&!vec.empty()) { node temp=vec.top();vec.pop(); if(find_father(temp.u,father)!=find_father(temp.v,father)) { merge(temp.u,temp.v,father),cnt++; maps.push_back(temp); } else continue; } if(cnt==n-1) { sort(maps.begin(),maps.end(),cmp); printf("map.size=%d\n",maps.size()); for(int i=maps.size()-1,t=0;i>=0;--i,++t) { if(t<k)maps[i].s*=2; printf("i=%d maps[i].s=%d ret=%d\n",i,maps[i].s,ret); ret=min(ret,maps[i].s); } return ret; } return -1; } };
http://www.jsqmd.com/news/466372/

相关文章:

  • 北京/上海/深圳/杭州/南京/无锡高端腕表维修指南:豪爵/库尔沃/蕾蒙威/播威故障养护与维修全解析 - 时光修表匠
  • 收藏备用!程序员转型AI的三个核心赛道(小白/进阶通用)
  • 产品推荐|八戒光度成像系统全新小型化款来了!
  • word打字输入及删除 很卡,延迟几秒钟
  • 《OpenClaw 实战:从 0 到 1 快速入门到进阶实战》一本全面掌握 OpenClaw 云桌面助理的实战指南:第二部分《进阶篇》
  • 《投资-407》长期价值投资考验的是眼光与格局, 考验的是战略方向的能力,其难度远大于战术上勤奋的能力,如何提升这方面的能力?
  • 高分子电气绝缘自粘胶带
  • 《OpenClaw 实战:从 0 到 1 快速入门到进阶实战》一本全面掌握 OpenClaw 云桌面助理的实战指南:第一部分 入门篇
  • 见面三分情:为什么当面沟通是最强大的沟通方式
  • 虚幻 UE5 像素流多用户部署,像素流多实例部署
  • Claude Opus4.6 实战记录,欢迎对标和超越!
  • Charlee44的技术驿站
  • 电商平台重复性咨询少 78%,KoalaQA AI 售后太省心
  • 在训练数据投毒:让算法认为996违反物理定律
  • 一篇文章带你搞懂“设计模式”! - - 责任链模式(23)
  • 北京营养自愈力专家亲测分享:效果真的好!
  • 基于分布式驱动电动汽车的‘四轮侧偏刚度估计‘模型:采用容积卡尔曼(CKF)进行估计并联合sim...
  • AI 重塑产品管理工具:从 Jira 到智能体项目经理的终极演进
  • 低代码 + AI = 对话方式生成UI
  • 解决Windows 11家庭版电脑通过网络邻居不能访问华为家庭存储的问题
  • 手把手教你用 Maven 搭建 JavaWeb 项目(避坑版)—— 解决 404 / 文件部署失败问题
  • 解密prompt系列. Agent Memory一览 - MATTS CFGM MIRIX
  • 好用的广告设计制作供应商
  • UFUN常用函数个人帮助表格
  • PHP 程序员为什么总是瞧不起 PHP ?
  • Python调用飞书Api处理多维数据表格——保姆教程3、通过飞书表格链接获取飞书表格内容的代码
  • 别人的热闹是真的,我的安静也是真的。别人的世界有万千灯火,我的世界,有我自己就足够完整
  • 基于 QT 的电力软件界面开发之旅
  • 四川本地AI业财一体化系统:统好AI的技术解析与优势
  • 基于CVaR的微网动态定价与调度策略:MATLAB代码探秘