每天一道leetcode:1192. 查找集群内的关键连接(图论困难tarjan算法)

news2024/11/18 3:19:28

今日份题目:

力扣数据中心有 n 台服务器,分别按从 0n-1 的方式进行了编号。它们之间以 服务器到服务器 的形式相互连接组成了一个内部集群,连接是无向的。用 connections 表示集群网络,connections[i] = [a, b] 表示服务器 ab 之间形成连接。任何服务器都可以直接或者间接地通过网络到达任何其他服务器。

关键连接 是在该集群中的重要连接,假如我们将它移除,便会导致某些服务器无法访问其他服务器。

请你以任意顺序返回该集群内的所有 关键连接

示例1

输入:n = 4, connections = [[0,1],[1,2],[2,0],[1,3]]
输出:[[1,3]]
解释:[[3,1]] 也是正确的。

示例2

输入:n = 2, connections = [[0,1]]
输出:[[0,1]]

提示

  • 2 <= n <= 105

  • n - 1 <= connections.length <= 105

  • 0 <= ai, bi <= n - 1

  • ai != bi

  • 不存在重复的连接

题目思路

根据关键连接的定义,我们可以将题目翻译为,找出删除会导致连通图不连通的点,进而翻译为找到删除后会导致图不连通的边的两点,也就是图论中所说的割边。使用tarjan算法找到割边。

tarjan算法是一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法。所谓强连通,就是说两个顶点可以相互通达。Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。

该题直接使用递归,没有涉及堆栈。其中有两个关键数组:dfn和low,dfn可以简单理解为记录我这个点是第几个被遍历到的(时间戳),low可以理解为我的父节点的时间戳。注意,是父节点,不是祖父甚至祖祖父。具体过程可以看我的代码注释。

这道题目有些难,我也是第一次接触到tarjan算法,欢迎懂的小伙伴在评论区科普一下,我也是从网上找的过程,但和本题的不太一样,我就直接读的代码,如果不对欢迎评论指出,谢谢!

代码

class Solution 
{
public:
    unordered_map<int,unordered_set<int>> connect;    
    vector<vector<int>> ans;
//------------------------ tarjan算法找割边 ------------------------//
    int dfn[200000]={0};      //节点搜索的次序编号,记录节点时间戳
    int low[200000]={0};      //子树能够追溯到的最早的栈中节点的次序号,即可以回溯到的最早的时间点
    int time=1;               //全局时间,时间戳
    //当dfn(u)=low(u)时,以u为根的搜索子树上所有节点是一个强连通分量。
    //dfn的值表示第几个被遍历到
    //low的值表示最早的连接我的点,初始值与dfn一样,后续更新为相连的最小时间戳的那个点的low值
    //全局变量time用来表示遍历到第几个了,用于提供dfn的值
    //默认边的表示是u->v

    void tarjan(int u,int parent)
    {
        //初始dfn和low的值都是时间戳
        dfn[u]=time;
        low[u]=time;
        time++;

        for(int v:connect[u]) //遍历u点的所有邻接点
        {
            if(v==parent) continue; //遍历到已经遍历过的节点了(把我引来的节点)
            if(dfn[v]==0) //由于初始化为0,所以等于0表示该节点还没有遍历过
            {
                tarjan(v,u); //判断邻接点的联通情况
                low[u]=min(low[u],low[v]); //low更新为与我相连的节点的最小时间戳
                //节点与每个相连的另一个节点比就能更新为相连的最小时间戳
                if(low[v]>dfn[u]) ans.push_back({u,v}); //是割边的两点的判断条件
            }
            else if(dfn[v]!=0) low[u]=min(low[u],dfn[v]); //该点遍历过了,只更新low
        }
    };

    vector<vector<int>> criticalConnections(int n, vector<vector<int>>& connections) 
    {                    
        for(auto x:connections) //将无向图转化为双向图便于使用tarjan算法
        {
            int u=x[0];
            int v=x[1];
            connect[u].insert(v);
            connect[v].insert(u);
        }
        tarjan(0,-1); //从0开始tarjan算法
        return ans;
    }
};

提交结果

欢迎大家在评论区讨论,如有不懂的部分,欢迎在评论区留言!

更新不易,宝子们点个赞支持下,谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

-Webkit-Box 在 Safari 中出现的兼容性问题

一、问题背景&#xff1a; UI要求要实现这样的效果&#xff0c;使用 display:-webket-box在chrome浏览器下完美解决 但是马上啪啪打脸&#xff0c;在safari浏览器下显示空白 &#xff0c;不能不说浏览器之间的兼容性简直就是天坑 二、解决办法 通过浏览器调试发现原本float的…

Java数字化智慧工地管理云平台源码(人工智能、物联网、大数据)

智慧工地优势&#xff1a;"智慧工地”将施工企业现场视频管理、建筑起重机械安全监控、现场从业人员管理、物料管理、进度管理、扬尘噪声监测等现场设备有机、高效、科学、规范的结合起来真正实现工程项目业务流与现场各类监控源数据流的有效结合与深度配合&#xff0c;实…

C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】

wpf iconfont 外部图标引入&#xff0c;无法正常显示问题。 1. 检查资源路径和引入格式是否正确2. 检查资源是否包含在程序集中 1. 检查资源路径和引入格式是否正确 正确的格式&#xff0c;注意字体文件 “xxxx.ttf” 应写为 “#xxxx” <TextBlock Text"&#xe7ae;…

Rust软件外包开发语言的特点

Rust 是一种系统级编程语言&#xff0c;强调性能、安全性和并发性的编程语言&#xff0c;适用于广泛的应用领域&#xff0c;特别是那些需要高度可靠性和高性能的场景。下面和大家分享 Rust 语言的一些主要特点以及适用的场合&#xff0c;希望对大家有所帮助。北京木奇移动技术有…

通过网络流量报告监控网络性能

实时网络流量监控已被组织广泛采用&#xff0c;作为了解网络性能和拥塞问题的首选技术。但是&#xff0c;有几个网络问题需要一个超越实时流量监控的解决方案。网络中的持续滞后可能会无人值守并影响整个网络的效率&#xff0c;使用网络流量报告将有助于管理网络环境中的风险。…

Visual Studio 2019 c++ 自定义注释 ----doxygen

可加入C 也可自定义。 <?xml version"1.0" encoding"utf-8"?> <CodeSnippets xmlns"http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"><CodeSnippet Format"1.0.0"><Header><Title>注释…

uniapp开发微信小程序使用painter将页面转换为图片并保存到本地相册

引言 我使用到painter的原因是&#xff0c;在uniapp开发微信小程序时&#xff0c;需要将一个页面的内容转换成图片保存到本地相册。 起初在网上找到很多都是在uniapp中使用 html2canvas 将网页转换成图片再jspdf将图片转换为pdf&#xff0c;但是这种方式在小程序环境不支持&am…

Redis-分布式锁!

分布式锁&#xff0c;顾名思义&#xff0c;分布式锁就是分布式场景下的锁&#xff0c;比如多台不同机器上的进程&#xff0c;去竞争同一项资源&#xff0c;就是分布式锁。 分布式锁特性 互斥性:锁的目的是获取资源的使用权&#xff0c;所以只让一个竞争者持有锁&#xff0c;这…

ARM--day4(电灯实验、分析RCC、GPIO控制器,PMOS管、NMOS管的基本原理)

电灯实验代码&#xff1a; .text .global _start _start: /**********LED1点灯**************/RCC_INIT:1.使能GPIOE组控制器&#xff0c;通过RCC_AHB4ENSETR寄存器设置第&#xff3b;5:4&#xff3d;位写&#xff11;---->0x50000A28[4]1ldr r0,0x50000A28ldr r1,[r0]orr…

基于ArcGis提取道路中心线

基于ArcGis提取道路中心线 文章目录 基于ArcGis提取道路中心线前言一、生成缓冲区二、导出栅格数据三、导入栅格数据四、新建中心线要素五、生成中心线总结 前言 最近遇到一个问题&#xff0c;根据道路SHP数据生成模型的时候由于下载的道路数据杂项数据很多&#xff0c;所以导…

XSS 跨站脚本攻击

XSS(DOM) XSS 又称CSS(Cross Site Scripting)或跨站脚本攻击&#xff0c;攻击者在网页中插入由JavaScript编写的恶意代码&#xff0c;当用户浏览被嵌入恶意代码的网页时&#xff0c;恶意代码将会在用户的浏览器上执行。 XSS攻击可分为三种&#xff1a;分别为反射型(Reflected…

NLP——操作步骤讲义与实践链接

数据集与语料 语料是NLP的生命之源&#xff0c;所有NLP问题都是从语料中学到数据分布的规律语料的分类&#xff1a;单语料&#xff0c;平行语料&#xff0c;复杂结构 语料的例子&#xff1a;Penn Treebank, Daily Dialog, WMT-1x翻译数据集&#xff0c;中文闲聊数据集&#xf…

使用navicat连接postgresql报错问题解决

使用navicat连接postgresql报错问题解决 一、问题现象&#xff1a; 最近使用Navicat来连接postgreSQL数据库&#xff0c;发现连接不上&#xff0c;报错信息如下&#xff1a; 自己百度了一下&#xff0c;发现pgsql 15版本以后&#xff0c;有些系统表的列名改了&#xff0c;pg_…

【tool】快捷操作

最近在弄材料然后文件太深了&#xff0c;交流起来很不方便&#xff0c;做了记录 复制文件路径 复制文件路径步骤&#xff1a; 1、首先按住Shift 鼠标右键单击&#xff0c;弹出&#xff1a;复制为路径 2、快捷键黏贴路径&#xff0c;即可

深入理解 Flutter 图片加载原理 | 京东云技术团队

前言 随着Flutter稳定版本逐步迭代更新&#xff0c;京东APP内部的Flutter业务也日益增多&#xff0c;Flutter开发为我们提供了高效的开发环境、优秀的跨平台适配、丰富的功能组件及动画、接近原生的交互体验&#xff0c;但随之也带来了一些OOM问题&#xff0c;通过线上监控信息…

VScode替换cmd powershell为git bash 终端,并设置为默认

效果图 步骤 1. 解决VScode缺少git bash的问题_failed to start bash - is git-bash.exe on the syst_Rudon滨海渔村的博客-CSDN博客效果解决步骤找到git安装目录下的/bin/bash.exe&#xff0c;复制其绝对路径&#xff0c;例如D:\Program Files\Git\bin\bash.exe把路径的右斜…

私域新零售商业模式成功的八大要素

从事互联网行业多年以来&#xff0c;遇到客户问最多的一个问题&#xff0c;就是什么样的模式火呀&#xff1f;在设计一个商业模式时&#xff0c;不单单只是考虑资金和人脉等等资源的&#xff0c;其实还是需要遵循这八大原则&#xff0c;它包括&#xff1a;客户价值最大化原则、…

vite打包配置以及性能优化

vite打包配置以及性能优化 安装插件 首先该安装的插件&#xff0c;你要安装一下吧 这三个是基本的插件&#xff0c;其他优化的插件下面会介绍到 "vite": "4.4.6","vite-plugin-html": "^3.2.0","vitejs/plugin-vue": &qu…

如何在windows电脑安装多个tomcat服务器和乱码问题

前提条件安装jdk 以17版本为例&#xff0c;将jdk8卸载干净 1.首先进入tomcat官网下载 tomcat网址 这里下载tomcat10为例子 1.1 这里选择方式一 下载解压版 2.解压后拷贝三份 分别命名为 8081、 8082、 8083 3.分别对每个tomcat执行以下操作 3.1 找到tomcat所在webapps文…

2023年38页智慧水利整体解决方案PPT

导读&#xff1a;原文《2023年38页智慧水利整体解决方案PPT》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 业务场景与痛点分析 业务架构图 总体目标 按照“建管并…