[Mdfs] lc3067. 在带权树网络中统计可连接服务器对数目(邻接表+图操作基础+技巧+好题)

server/2024/10/18 14:23:29/

文章目录

    • 1. 题目来源
    • 2. 题目解析

1. 题目来源

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

2. 题目解析

挺有意思的一道题目,重点是要能够读懂题目,然后结合几个图相关的处理技巧即可拿下。

  • 图存储:邻接表即可。
  • 无向无环图的单侧图遍历:无向图一般邻接表建立两条边,正常图遍历会有重复边。一般的处理操作就是遍历时记录一个 fa 父节点即可,即不会往父节点方向遍历,则一直会向下遍历,最终结果无重复。
  • 结果处理:实际上就是每个节点作为根节点,作为服务器 C,查找子树中的所有与根节点距离能被整除的节点个数。这里计数需要使用到乘法原理,具体看下摘自灵神的这张图即可:
    在这里插入图片描述
  • 优化技巧:如果枚举的根,相邻点只有一个的话,那么结果一定是 0,因为要求 C 到 A、B 的边是不重复的。

  • 时间复杂度 O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度 O ( n ) O(n) O(n)

class Solution {
public:vector<int> countPairsOfConnectableServers(vector<vector<int>>& edges, int signalSpeed) {int n = edges.size() + 1;vector<vector<pair<int, int>>> g(n);for (auto &e : edges) {int x = e[0], y = e[1], w = e[2];g[x].push_back({y, w});g[y].push_back({x, w});}vector<int> ans(n);for (int i = 0; i < n; i ++ ) {// 如果只有一个相邻点,则结果为 0。因为该点不能作为 C 点,题目要求没有与 a、b 的公共边if (g[i].size() == 1) {continue;}int sum = 0;for (auto &[y, wt] : g[i]) {    // 递归遍历子树int cnt = dfs(y, i , wt, signalSpeed, g);ans[i] += cnt * sum;sum += cnt;}}return ans;}// dfs 统计子树中有多少节点可以被整除int dfs(int x, int fa, int sum, int signalSpeed, vector<vector<pair<int ,int >>> g) {int cnt = sum % signalSpeed == 0;for (auto &[y, wt] : g[x]) {if (y != fa) {      // 不等于父节点,只计算单边树cnt += dfs(y, x, sum + wt, signalSpeed, g);}}return cnt;}
};

http://www.ppmy.cn/server/48962.html

相关文章

vscode软件上安装 Fitten Code插件及使用

一. 简介 前面几篇文章学习了 Pycharm开发工具上安装 Fitten Code插件&#xff0c;以及 Fitten Code插件的使用。 Fitten Code插件是是一款由非十大模型驱动的 AI 编程助手&#xff0c;它可以自动生成代码&#xff0c;提升开发效率&#xff0c;帮您调试 Bug&#xff0c;节省…

【React】在 React 组件中,怎么使用useContext

在React中,useContext 是一个Hook,它允许你无需显式地通过组件树的每一层来传递 props,就能将值深入到组件树的任何位置。要使用 useContext,你需要先创建一个 Context 对象,然后使用这个对象提供的 Provider 组件来包裹你的应用中的一部分。然后,任何在这个 Provider 下…

记录vue一个echarts页面 柱状图加平均分横线 双柱状图 横向双柱状图

​​​​​​​ <template><div class"app-container"><el-form :model"queryParams" ref"queryForm" size"small" v-show"showSearch" label-width"85px"><el-form-item label"园所名…

java写一个验证码

生成验证码 内容&#xff1a;可以是小写字母&#xff0c;也可以是大写字母&#xff0c;还可以是数字 规则 长度为5 内容中是四位字母&#xff0c;1位数字。 其中数字只有1位&#xff0c;但是可以出现在任意的位置。 package User;import java.util.ArrayList; import jav…

C#调用外部API(托管和非托管DLL)

DLL程序的两种类型 托管对象(有垃圾回收机制&#xff0c;内存安全)非托管对象(无垃圾回收机制&#xff0c;需手动回收) 托管对象与非托管对象具体区别参考&#xff1a;【C#】中托管与非托管对象区别、托管与非托管DLL区别_c# dllimport 托管dll-CSDN博客 生成和调用托管对象…

新增多种图表类型,新增视频、流媒体、跑马灯组件,DataEase开源数据可视化分析工具v2.7.0发布

2024年6月11日&#xff0c;人人可用的开源数据可视化分析工具DataEase正式发布v2.7.0版本。 这一版本的功能变动包括&#xff1a;图表方面&#xff0c;新增对称条形图、桑基图、流向地图、进度条等图表类型&#xff0c;并对已有的仪表盘、指标卡、明细表、汇总表、水波图、象限…

【面试干货】Java集合类详解:List、Set、Queue、Map、Stack的特点与用法

【面试干货】Java集合类详解&#xff1a;List、Set、Queue、Map、Stack的特点与用法 1、Map1.1 特点1.2 用法1.3 常见的实现类 2、Set2.1 特点2.2 用法2.3 常见的实现类 3、List3.1 特点3.2 用法3.3 常见的实现类 4、Queue4.1 特点4.2 用法4.3 常见的实现类 5、Stack5.1 特点5.…

MySQL函数

1.数学函数 数学函数用于对数字表达式进行数学运算&#xff0c;并返回运算结果。 1&#xff09;rand()函数 用来返回函数0 -1的随机值。 select rand(),rand(),rand(); 2&#xff09;sqrt()函数 用于返回一个数的平方根。 select sqrt(3),sqrt(4),sqrt(9); 3&#xff09;abs(…