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

3067. 在带权树网络中统计可连接服务器对数目 Medium

给你一棵无根带权树,树中总共有 n 个节点,分别表示 n 个服务器,服务器从 0 到 n - 1 编号。同时给你一个数组 edges ,其中 edges[i] = [ai, bi, weighti] 表示节点 ai 和 bi 之间有一条双向边,边的权值为 weighti 。再给你一个整数 signalSpeed 。

如果两个服务器 a ,b 和 c 满足以下条件,那么我们称服务器 a 和 b 是通过服务器 c 可连接的 :

 ·a < b ,a != c 且 b != c 。

 ·从 c 到 a 的距离是可以被 signalSpeed 整除的。

 ·从 c 到 b 的距离是可以被 signalSpeed 整除的。

 ·从 c 到 b 的路径与从 c 到 a 的路径没有任何公共边。

请你返回一个长度为 n 的整数数组 count ,其中 count[i] 表示通过服务器 i 可连接 的服务器对的 数目 。

示例 1:

输入:edges = [[0,1,1],[1,2,5],[2,3,13],[3,4,9],[4,5,2]], signalSpeed = 1
输出:[0,4,6,6,4,0]
解释:由于 signalSpeed 等于 1 ,count[c] 等于所有从 c 开始且没有公共边的路径对数目。
在输入图中,count[c] 等于服务器 c 左边服务器数目乘以右边服务器数目。

示例 2:

输入:edges = [[0,6,3],[6,5,3],[0,3,1],[3,2,7],[3,1,6],[3,4,2]], signalSpeed = 3
输出:[2,0,0,0,0,0,2]
解释:通过服务器 0 ,有 2 个可连接服务器对(4, 5) 和 (4, 6) 。
通过服务器 6 ,有 2 个可连接服务器对 (4, 5) 和 (0, 5) 。
所有服务器对都必须通过服务器 0 或 6 才可连接,所以其他服务器对应的可连接服务器对数目都为 0 。

提示:

 ·2 <= n <= 1000

 ·edges.length == n - 1

 ·edges[i].length == 3

 ·0 <= ai, bi < n

 ·edges[i] = [ai, bi, weighti]

 ·1 <= weighti <= 106

 ·1 <= signalSpeed <= 106

 ·输入保证 edges 构成一棵合法的树。

题目大意:计算每个结点可连接的服务器对数。

分析:

(1)将某个结点看作根,只有该结点有多个子树时,该结点才有可连接的服务器对,否则由于其余服务器到该结点有公共边,该结点可连接的服务器对数为0;

(2)基于(1)中结论,某个结点可连接的服务器对数ans[i]计算方式如下(将与该结点的距离是signalSpeeed倍数的结点称之为符合要求的结点):用深度优先遍历算法计算每个子树符合要求的结点个数,ans[i]即为这些子树中符合要求的结点进行交叉配对最多可以配对的服务器对数;

(3)根据(2)中算法可以得到1个结点可连接的对数,采取相同做法对每个结点进行深度优先遍历就能计算得到每个结点可连接的服务器对数;

(4)本题结点较多,采用邻接矩阵存储时间复杂度较高,为O(N3),会超时,但所给数据结构是树,只有n-1条边,考虑到边较少,因此采用邻接表存储,将时间复杂度降为O(N2)。

class Solution {
public:vector<int> countPairsOfConnectableServers(vector<vector<int>>& edges, int signalSpeed) {int N=edges.size()+1,sumNode,sum;vector<vector<pair<int,int>>> dis(N);vector<int> ans(N,0);function<int(int,int,int)> dfs=[&](int root,int parent,int length){int num=0;if(!length) ++num;for(auto& [node,len]:dis[root]){if(node!=parent) num+=dfs(node,root,(length+len)%signalSpeed);}return num;};for(auto& ele:edges){dis[ele[0]].emplace_back(ele[1],ele[2]);dis[ele[1]].emplace_back(ele[0],ele[2]);}for(int i=0;i<N;++i){sum=0;for(auto& [root,len]:dis[i]){sumNode=dfs(root,i,len%signalSpeed);ans[i]+=sumNode*sum;sum+=sumNode;}}return ans;}
};
//邻接矩阵存储,超时的算法
// class Solution {
// public:
//     vector<int> countPairsOfConnectableServers(vector<vector<int>>& edges, int signalSpeed) {
//         int N=edges.size()+1,sumNode,sum;
//         vector<vector<int>> dis(N,vector<int>(N,0));
//         vector<int> ans(N,0);
//         function<int(int,int,int)> dfs=[&](int node,int parent,int length){
//             int num=0;
//             length+=dis[parent][node];
//             if(!(length%signalSpeed)) ++num;
//             for(int i=0;i<dis.size();++i){
//                 if(dis[node][i]>0&&i!=parent) num+=dfs(i,node,length);
//             }
//             return num;
//         };
//         for(int i=0;i<N-1;++i) dis[edges[i][0]][edges[i][1]]=dis[edges[i][1]][edges[i][0]]=edges[i][2];
//         for(int i=0;i<N;++i){
//             sum=0;
//             for(int j=0;j<N;++j){
//                 if(dis[i][j]>0){
//                     sumNode=dfs(j,i,0);
//                     ans[i]+=sumNode*sum;
//                     sum+=sumNode;
//                 }
//             }
//         }
//         return ans;
//     }
// };

相关文章:

  • JVM面试篇(下)
  • selenium的使用教程
  • webshell工具流量特征
  • 【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【06】【商品服务】接口文档地址_三级分类_SPU_SKU
  • 【创作活动】面对层出不穷的AI大模型产品我们应该怎么选择?
  • 【JavaScript脚本宇宙】通知新风尚:打造互动性十足的Web提示系统
  • VB7/64位VB6开发工具office插件开发-twinbasic
  • 【Redis】redis高阶-使用zset实现延时队列
  • qt网络事件之QSocketNotifier
  • 拥抱生态农业,享受绿色生活
  • 软件测试--第三章 软件测试方法
  • java判断对象是否还在被引用
  • 【设计模式】装饰器模式(结构型)⭐⭐
  • linux常用命令及其选项
  • 手撸一个java网关框架
  • CentOS6 编译安装 redis-3.2.3
  • iOS小技巧之UIImagePickerController实现头像选择
  • Laravel 实践之路: 数据库迁移与数据填充
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • vue-router 实现分析
  • 成为一名优秀的Developer的书单
  • 两列自适应布局方案整理
  • 前端js -- this指向总结。
  • 浅谈web中前端模板引擎的使用
  • 悄悄地说一个bug
  • 算法-图和图算法
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微信小程序设置上一页数据
  • 无服务器化是企业 IT 架构的未来吗?
  • 一个完整Java Web项目背后的密码
  • Spring Batch JSON 支持
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #1014 : Trie树
  • #预处理和函数的对比以及条件编译
  • (0)Nginx 功能特性
  • (23)Linux的软硬连接
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (C语言)字符分类函数
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (三)Honghu Cloud云架构一定时调度平台
  • (三)模仿学习-Action数据的模仿
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (一) storm的集群安装与配置
  • (原)本想说脏话,奈何已放下
  • (原創) 物件導向與老子思想 (OO)
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • ***测试-HTTP方法
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .NET 中创建支持集合初始化器的类型
  • .NET 中让 Task 支持带超时的异步等待
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • @SuppressLint(NewApi)和@TargetApi()的区别