【力扣每日一题】2023.8.31 一个图中连通三元组的最小度数

news/2024/7/23 9:33:11 标签: leetcode, 算法, c++, 数据结构

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

题目给我们一个无向图,要我们找出三个节点,这三个节点他们两两相连,这三个节点除了连接到对方的其他线被称为连通三元组的度数,问我们图中最小的三元组度数是多少。

我的第一个想法就是使用map来构建图,然后遍历每个节点,再遍历每个节点的相邻节点,再遍历每个节点的相邻节点的相邻节点,如果节点的相邻节点的相邻节点是该节点,那么我们就找到了连通三元组,他们总体的度数-6就是连通三元组的度数。因为三元组中每个节点为了连通另外两个节点,都需要花费两个度,而剩余的度就是连接其他非本三元组的节点了,所以连通三元组的度数就是三个节点的总度数-2*3。

不过这么做就超时了,因为同一个三元组我们会重复遍历三次,每个节点我们都会遍历寻找包括它的连通三元组。虽然这种方式超时了,但也不失为一种方法,代码在下面,可以参考。

那么直接构建图不行,我们可以构建图的邻接矩阵。

我们另外再拿一个数组来存放每个节点的度数。

邻接矩阵用来判断三个点是否是相互连通的,度数数组用来计算连通三元组的度数。

代码:

class Solution {
public:
    int minTrioDegree(int n, vector<vector<int>>& edges) {
        //超时
        unordered_map<int,unordered_set<int>>m;
        for(auto edge:edges){   //构建图
            if(m.find(edge[0])==m.end()) m[edge[0]]=unordered_set<int>();
            if(m.find(edge[1])==m.end()) m[edge[1]]=unordered_set<int>();
            m[edge[0]].insert(edge[1]);
            m[edge[1]].insert(edge[0]);
        }
        int res=INT_MAX;
        for(auto& i:m){     //取出每个节点
            for(auto& j: i.second){     //取出相连的节点集
                for(auto& k: m[j]){         //取出相连的节点的相连结果集
                    if(m[k].count(i.first)){    //若是等于第一个节点,那么表示这仨节点相互连通
                        res=min(res,static_cast<int>(i.second.size()+m[j].size()+m[k].size()-6));
                    }
                }
            }
        }
        return res==INT_MAX?-1:res;
        
        //构建邻接矩阵 
        int res=INT_MAX;
        vector<vector<int>>pic(n+1,vector<int>(n+1,0)); //连通矩阵
        vector<int>du(n+1,0);   //每个点的度
        for(auto& edge: edges){     //构建邻接矩阵以及获取每个节点的度
            pic[edge[0]][edge[1]]=1;pic[edge[1]][edge[0]]=1;
            du[edge[0]]++;du[edge[1]]++;
        } 
        for(int i=1;i<=n;i++){  
            for(int j=i+1;j<=n;j++){
                for(int k=j+1;k<=n;k++){
                    //遍历每个节点,找到相互连通的三个节点,度数之和-6就是连通三元组的读度数
                    if(pic[i][j] && pic[j][k] && pic[i][k]) res=min(res,du[i]+du[j]+du[k]-6);
                }
            }
        }
        return res==INT_MAX?-1:res;
    }
};


http://www.niftyadmin.cn/n/4993470.html

相关文章

Java设计模式:四、行为型模式-10:访问者模式

一、定义&#xff1a;访问者模式 访问者模式&#xff1a;核心在于同一个事物不同视角下的访问信息不同。 在一个稳定的数据结构下&#xff0c;例如用户信息、雇员信息等&#xff0c;增加易变的业务访问逻辑。为了增强扩展性&#xff0c;将两部分的业务解耦的一种设计模式。 二…

VBA快速插入签名(位置不固定)

实例需求&#xff1a;Excel中的多页表格如下图所示&#xff0c;其中包含多个“受益人签字”&#xff0c;其位置不固定&#xff0c;现在需要在其后插入签名图片。 签名图片为透明背景的PNG文件&#xff08;左上角方框内的部分&#xff09;&#xff0c;图片文件属性信息如下图所示…

mysql8忘记密码的步骤

1.关闭服务器&#xff0c;要管理员打开 cmd net stop mysql 2.进入 到mysql\bin中。跳过密码 mysqld --console --skip-grant-tables --shared-memory 3.新打开一个窗口 mysql -u root -p 密码不输入&#xff0c;直接回车 4.修改密码为空 use mysql; update user set a…

git_合并分支

1、环境 (1)将测试分支dev合并到master分支。 (2)使用merge命令。 2、合并步骤 (1)切换到master分支 git checkout master (2)如果是多人开发的话&#xff0c;需要把远程master上的代码pull下来。 //如果是自己一个开发就没有必要了&#xff0c;不过为了保险起见还是pul…

layui引入百度地图

<script type"text/javascript" src"//api.map.baidu.com/api?typewebgl&v1.0&ak你的ak"></script> <script src"https://code.bdstatic.com/npm/jquery1.12.4/dist/jquery.min.js"></script> <script src&…

安达发|APS软件排程规则及异常处理方案详解

随着科技的发展&#xff0c;工业生产逐渐向智能化、自动化方向发展。APS(高级计划与排程)软件作为一种集成了先进技术和理念的工业软件&#xff0c;可以帮助企业实现生产过程的优化和控制。其中&#xff0c;排程规则是APS软件的核心功能之一&#xff0c;它可以帮助企业合理安排…

9.1 消息 字体 颜色 文件对话框 发布软件

保存 void Widget::on_savebtn_clicked() {QString filename QFileDialog::getSaveFileName(this, "保存", "C:/Users/yc/Desktop/", "图片 (*.png *.xpm *.jpg);;文本 (*.txt);;所有文件 (*.*)");if(filename.isNull()){QMessageBox::informa…

python遍历文件夹下的所有子文件夹,并将指定的文件复制到指定目录

python遍历文件夹下的所有子文件夹&#xff0c;并将指定的文件复制到指定目录 需求复制单个文件夹遍历所有子文件夹中的文件&#xff0c;并复制代码封装 需求 在1文件夹中有1&#xff0c;2两个文件夹 将这两个文件夹中的文件复制到 after_copy中 复制单个文件夹 # coding: ut…