首页 > 编程语言 >算法题——冗余连接

算法题——冗余连接

时间:2024-10-27 12:08:58浏览次数:4  
标签:index vector int 节点 算法 edges 连接 冗余 Find

684.冗余连接

题干

树可以看成是一个连通且 无环 的 无向 图。

给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edges[i] = [ai, bi] 表示图中在 ai 和 bi 之间存在一条边。

请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n 个节点的树。如果有多个答案,则返回数组 edges 中最后出现的那个。


输入: edges = [ [1,2], [1,3], [2,3] ]
输出: [2,3]


输入: edges = [ [1,2], [2,3], [3,4], [1,4], [1,5] ]
输出: [1,4]

思路

对于一个包含n个节点的图,至少需要n-1条边才能使图连接起来,本题中共有n条边,n个节点,那么出现的第一条使得图成环的边就是最后一条使得图成环的边,即该边就是答案。

在无环图中考虑连通性使用并查集,在有向图中考虑依赖性使用dfs、bfs或拓扑排序。

vector<int> findRedundantConnection(vector<vector<int>>& edges) {
        int len=edges.size();
        vector<int> p(len+1);
        for(int i=1; i<=len; ++i)
        {
            p[i]=i;
        }
        for(auto &edge : edges)
        {
            int v1=edge.front(), v2=edge.back();
            //查找两个节点v1和v2是否属于同一个集合
            if(Find(p,v1)!=Find(p,v2))
            {
                Union(p,v1,v2);
            }
            else
            {
                return edge;
            }
        }
        return vector<int>{};
    }
    int Find(vector<int>& p, int index)
    {
        //如果index的parent不是index,说明index已经归到某个集合中,继续查找index的parent
        //最顶层的index的parent是其本身
        if(p[index]!=index)
        {
            p[index]=Find(p,p[index]);
        }
        return p[index];
    }
    void Union(vector<int> &p, int v1, int v2)
    {
        //定义联合为将v1所在的集合的父节点设置为v2所在集合的父节点,这样两个集合就连接了
        p[Find(p,v1)]=Find(p,v2);
    }

标签:index,vector,int,节点,算法,edges,连接,冗余,Find
From: https://www.cnblogs.com/HD0117/p/18508139

相关文章

  • C语言中如何实现图算法
    在C语言中,您可以实现图算法通过以下关键步骤:一、创建图的数据结构,二、实现图的操作,例如添加边、删除边、搜索顶点等,三、编写图的遍历算法,如深度优先搜索和广度优先搜索,四、编写图路径查找算法如迪杰斯特拉算法和弗洛伊德算法,五、通过应用使得图算法更适用于实际问题。对于第一点......
  • 连接数据库
    //DriverManager.getConnection("地址","账户","密码");密码一定要齐全不能有空格importjava.sql.Connection;importjava.sql.DriverManager;publicclassJDBC{publicstaticvoidmain(String[]args){try{Class.forName("com.mysql.cj.jdbc.D......
  • 100种算法【Python版】第13篇——埃拉托斯特尼素数筛法
    本文目录1基本原理2算法步骤2.1初始化:2.2标记非素数:2.3收集素数:3数学示例4python代码1基本原理埃拉托斯特尼筛法(SieveofEratosthenes)是一种经典的算法,用于高效地寻找一定范围内的所有素数。该算法以古希腊数学家埃拉托斯特尼命名,具有简单易懂......
  • 关于git中出现的无法连接的问题
    问题有时候使用gitclone或者pipinstall会出现无法访问的情况如OpenSSLSSL_read:SSL_ERROR_SYSCALL,errno0以及Failedtoconnecttogithub.comport443after21113ms:Couldnotconnecttoserver,这些可能是由于代理的配置造成的取消全局代理gitconfig--g......
  • 算法的尽头是小学奥数?小学奥数必须掌握的30个知识模块
    1.和差倍问题和差问题和倍问题差倍问题已知条件几个数的和与差几个数的和与倍数几个数的差与倍数公式适用范围已知两个数的和,差,倍数关系公式①(和-差)÷2=较小数较小数+差=较大数和-较小数=较大数②(和+差)÷2=较大数较大数-差=较小数和-较大数=较小数和÷(倍数+1)=小数......
  • 必学排序算法——基数排序
    目录前言一、什么是基数排序二、算法思想三、算法分析1、时间复杂度2、空间复杂度四、算法的优点五、算法的缺点六、优化方案七、动态图解八、经典例题1.排序数组代码题解九、结语前言基数排序算法是必须掌握的一种基础算法,在一些比较出名的竞赛acm、蓝桥杯,并且在......
  • 算法笔记:Day-04(二维前缀和)
    二维数组及滚动数组304.二维区域和检索-矩阵不可变classNumMatrix{privatefinalint[][]sum;publicNumMatrix(int[][]matrix){intm=matrix.length;intn=matrix[0].length;sum=newint[m+1][n+1];for(in......
  • 《模拟退火算法:在随机中探寻最优解的奇妙之旅》
    在优化算法的广阔天地中,模拟退火算法犹如一颗璀璨的明星,以其独特的魅力和强大的功能吸引着众多研究者和实践者。今天,让我们一同踏上模拟退火算法的奇妙之旅,探索它的奥秘与魅力。一、模拟退火算法的起源与灵感模拟退火算法的灵感来源于固体退火过程。在物理学中,退火是将固体加......
  • 10.26如何进行简单的java连接数据库
    1建表1.win+R输入cmd输入mysql-uroot-p输入密码2.查看数据库原本的成员showdatabases3.创建一个新表,如studentcreatedatabasestudent;4.使用usestudent;createtablestudent(idint,namevarchar(10));5.插入insertintostudentvalue(1,'张三');in......
  • 点跟踪论文—CoTracker: It is Better to Track Together使用Transform的时间与空间注
    CoTracker:ItisBettertoTrackTogether使用Transform的时间与空间注意力机制的密集点联合追踪算法详细解析文章概括总结:在之前学习的TrackingEverythingEverywhereAllatOnce(2023ICCV最佳学生论文)与RAFT:RecurrentAll-PairsFieldTransformsforOpticalF......