1761. 一个图中连通三元组的最小度数

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:无向图暴力枚举
    • 方法二:给无向图定向
  • 写在最后

Tag

【暴力枚举】【度数】【有向图】【无向图】


题目来源

1761. 一个图中连通三元组的最小度数
在这里插入图片描述

题目解读

现在有一个无向图,找出连通三元组中度数的最小值,如果没有三元组,则返回 -1。连通三元组指的是三个节点组成的集合并且两两之间有边。连通三元组的度数指的是排除指向三元组其他顶点的度数。


解题思路

方法一:无向图暴力枚举

看看数据 O ( n 3 ) O(n^3) O(n3) 的时间复杂度不会超时。于是直接枚举所有的三元组,找出最小的度数即可。

具体实现中,需要建立起顶点之间的邻接表 grids,两个顶点之间相连用 girds[i][j] = 1 表示。需要统计每个节点的度 degree[i]

枚举所有顶点时,如果 grids[i][j] = 1grids[j][k] = 1grids[k][i] = 1 时,我们则认为顶点 ijk 构成连通三元组。该连通三元组的度数为 degree[i] + degree[j] + degree[k] - 6

代码

class Solution {
public:int minTrioDegree(int n, vector<vector<int>>& edges) {vector<vector<int>> grids(n, vector<int>(n));vector<int> degree(n);for (auto& edge : edges) {int x = edge[0] - 1, y = edge[1] - 1;grids[x][y] = grids[y][x] = 1;++degree[x];++degree[y];}int res = INT_MAX;for (int i = 0; i < n; ++i) {for (int j = i+1; j < n; ++j) {if (grids[i][j] == 1) {for (int k = j+1; k < n; ++k) {if (grids[j][k] == 1 && grids[k][i] == 1) {res = min(res, degree[i] + degree[j] + degree[k] - 6);}}}}}return res == INT_MAX ? -1 : res;}
};

复杂度分析

时间复杂度: O ( n 3 ) O(n^3) O(n3) n n n 为顶点个数。

空间复杂度: O ( n 2 ) O(n^2) O(n2),因为需要存储顶点之间的关系即邻接矩阵的大小。

方法二:给无向图定向

因为本题的数据规模在 1 0 2 10^2 102 左右,暴力枚举的时间复杂度也在 1 0 7 10^7 107 左右,所以可以过。但是如果数据规模再大一些,比如 1 0 5 10^5 105,那么无向图的暴力枚举一定过不了。对这样规模的数据,如何解决呢?

我们考虑给无向图定向,具体地,如果图中的两个顶点 ij,它们之间有一条无向边:

  • 如果 degree[i] < degree[j],那么边的方向由 i 指向 j
  • 如果 degree[i] > degree[j],那么边的方向由 j 指向 i
  • 如果 degree[i] = degree[j],那么边的方向由编号较小的顶点指向编号较大的顶点;

我们给无向图进行以上规则的定向之后,任意一个节点的出度都不会超过 2 m \sqrt{2m} 2m m m m 为图的边数,现在利用反证法进行证明。

假设节点 i 的出度大于 2 m \sqrt{2m} 2m ,那么节点 i 在原始无向图中的度数(出度+入度)大于 2 m \sqrt{2m} 2m ,那么顶点 i 指向的顶点在无向图中的入度大于 2 m \sqrt{2m} 2m ,其出度自然也大于 2 m \sqrt{2m} 2m 。因此总数大于 2 m ∗ 2 m = 2 m \sqrt{2m} * \sqrt{2m} = 2m 2m 2m =2m(第一个 2 m \sqrt{2m} 2m 表示从顶点 i 出去的边的数量),这与边数为 m m m 的图总度数为 2 m 2m 2m 矛盾。于是任意一个节点的出度都不会超过 2 m \sqrt{2m} 2m

接下来进行有向图上的连通三元组枚举计算就可以了。

实现中除了要使用一个数组 degree 记录各个顶点的度数之外,还会使用到哈希集合 grids 来记录原无向图中与各个顶点连接的所有顶点,使用二维数组 h 记录有向图。

代码

class Solution {
public:int minTrioDegree(int n, vector<vector<int>>& edges) {vector<unordered_set<int>> grids(n);    // 原无向图vector<vector<int>> h(n);               // 有向图vector<int> degree(n);                  // 统计节点度数for (auto& edge : edges) {int x = edge[0] - 1, y = edge[1] - 1;grids[x].insert(y);grids[y].insert(x);++degree[x];++degree[y];}for (auto& edge : edges) {int x = edge[0] - 1, y = edge[1] - 1;if (degree[x] < degree[y] || (degree[x] == degree[y] && x < y)) {h[x].push_back(y);}else {h[y].push_back(x);}}int res = INT_MAX;for (int i = 0; i < n; ++i) {for (int j : h[i]) {for (int k : h[j]) {if (grids[i].count(k)) {res = min(res, degree[i] + degree[j] + degree[k] - 6);}}}}return res == INT_MAX ? -1 : res;}
};

复杂度分析

时间复杂度: O ( n + m m ) O(n+m\sqrt{m}) O(n+mm ),因为枚举连通三元组第一层是枚举的是 顶点 i 指向顶点 j 构成的边,这一步部分时间复杂度为 O ( m ) O(m) O(m);第二层枚举 j 指向节点 k,由于 j 的出度不超过 2 m \sqrt{2m} 2m ,这一部分时间复杂度为 O ( m ) O(\sqrt{m}) O(m );第三层判断 k 是否与 i 构成无向边,使用哈希表,时间复杂度为 O ( 1 ) O(1) O(1)。其中, n n n 为顶点的数量, m m m 为图中的边数。

空间复杂度: O ( m ) O(m) O(m),邻接表使用的空间。


写在最后

以上就是本篇文章的内容了,感谢您的阅读。🍗🍗🍗

如果感到有所收获的话可以给博主点一个 👍 哦。

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出。💬💬💬

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【请求报错:javax.net.ssl.SSLHandshakeException: No appropriate protocol】

1、问题描述 在请求服务时报错说SSL握手异常协议禁用啥的&#xff0c;而且我的连接数据库的url也加了useSSLfalse javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)2、解决方法 在网上查找了方法…

mate60 里的2035 到底是什么鬼?

华为在 lengbulangqiang 的情况下发布了 mate60 手机&#xff0c;犹如一颗核弹升到了各国的上空&#xff0c;每个人都很想知道这其中发生了什么事情&#xff0c;也是疑点重重&#xff0c;这其中的一些疑点&#xff0c;足以让某些人暴跳如雷。 这 2035 标识到底是什么&#xff1…

弹性盒子的使用

一、定义 弹性盒子是一种用于按照布局元素的一维布局方法&#xff0c;它可以简便、完整、响应式地实现各种页面布局。 容器中存在两条轴&#xff0c;主轴和交叉轴(相当于我们坐标轴的x轴和y轴)。我们可以通过flex-direction来决定主轴的方向。 主轴&#xff08;main axis&am…

SpringCloudAlibaba Gateway(三)-整合Sentinel功能路由维度、API维度进行流控

Gateway整合Sentinel ​ 前面使用过Sentinel组件对服务提供者、服务消费者进行流控、限流等操作。除此之外&#xff0c;Sentinel还支持对Gateway、Zuul等主流网关进行限流。 ​ 自sentinel1.6.0版开始&#xff0c;Sentinel提供了Gateway的适配模块&#xff0c;能针对路由(rou…

Leetcode1090. 受标签影响的最大值

思路&#xff1a;根据值从大到小排序&#xff0c;然后在加的时候判断是否达到标签上限即可&#xff0c;一开始想用字典做&#xff0c;但是题目说是集合却连续出现两个8&#xff0c;因此使用元组SortedList进行解决 class Solution:def largestValsFromLabels(self, values: li…

MIPI D-PHY的初始化(MIPI Alliance Xilinx)

DPHY的基本介绍及使用已有很多文章&#xff0c;基本是基于《MIPI Alliance Specification for D-PHY 》的内容&#xff0c;学习时也以此为准&#xff0c;可参考CSDN上的文章。着重讲述MIPI D-PHY的初始化部分 1 D-PHY的功能及使用 下面的文章讲的不错&#xff0c;既有理论&…

基于Matlab实现生活中的图像信号分类(附上源码+数据集)

在我们的日常生活中&#xff0c;我们经常会遇到各种各样的图像信号&#xff0c;例如照片、视频、图标等等。对这些图像信号进行分类和识别对于我们来说是非常有用的。在本文中&#xff0c;我将介绍如何使用Matlab来实现生活中的图像信号分类。 文章目录 介绍源码数据集下载 介…

Hive-安装与配置(1)

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 个人主页&#xff1a;beixi 本文章收录于专栏&#xff08;点击传送&#xff09;&#xff1a;【大数据学习】 &#x1f493;&#x1f493;持续更新中&#xff0c;感谢各位前辈朋友们支持…

dockerfile 例子(二)

Dockerfile由一行一行的命令语句组成&#xff0c;#开头的为注释行。Dockerfile文件内容分为四个部分&#xff1a;基础镜像信息、维护者信息、镜像操作指令以及容器启动执行指令。 接下来给大家列出Dockerfile中主要命令的说明。 FROM&#xff0c;指定所创建镜像的基础镜像。 …

网站IP流量与来路逆向营销

直接刷主流统计平台任意来路IP&#xff0c;另类思路让客户主动找上门 一般的站长或者网站拥有者都会在自己网站添加统计系统以分析监控用户访问&#xff0c;而其中用户关注最多的是关键词和来路&#xff0c;这样如果我们能在统计来路里把我们自己网站推送给跟我们业务相关的网站…

【笔记】常用 js 函数

数组去重 Array.from(new Set()) 对象合并 Object.assign . 这里有个细节&#xff1a;当两个对象中含有key相同value不同时&#xff0c;会以 后面对象的key&#xff1a;value为准 保留小数点后几位 toFixed 注意&#xff1a; Number型&#xff0c;用该方法处理完&#xff0c;会…

3.0 Dubbo的可扩展机制SPI源码解析

1. Dubbo SPI 架构图 2. Demo ExtensionLoader<Protocol> extensionLoader ExtensionLoader.getExt ensionLoader(Protocol.class); Protocol http extensionLoader.getExtension("dubbo"); System.out.println(http); 上⾯这个Demo就是Dubbo常⻅的写法&am…