今天是leetcode685 冗余连接

今天是leetcode685 冗余连接

  • 这题容易想到的是有几种情况能找到多余的边
  1. 有两条边同时指向某个点(冲突)

img

  1. 根节点被某条边指向(成环)

img

用如下代码记录冲突和环路

if(p[to] != to) {//若该边指向的点已有父点,则产生冲突
                con = i;//记录冲突边
            }
            else {//若该边不是产生冲突的边
                p[to] = from;
                if(find(to) == find(from)) {
                    cur = i;//若该边连接的两点经过查询属于同一连通集,则产生环路。
                }else {
                    union(from, to); 
                }
                
            }

那怎么根据上述两种情况找到满足条件的多余边呢?

  1. 针对第一种情况,答案肯定是在这两条边中的一个,那么是哪一个呢?

这里又涉及两种情况,图中存在环和不存在环

  • 若图中存在环,那么答案一定是两条边中在环上的那一个。然而怎么找到在环上的那一个呢?

导致冲突的那一条边不会被判定成成环,因此是另一条边。

(即使真的有一种情况是冲突和成环是同一边,那也会被判定为无环,而这种情况下就会将这条边作为答案)

img

  • 若图中无环,那就选择这两条边中后出现的那个,也就是记录在案的产生冲突的边。

img

  1. 针对第二种情况,图中肯定有环,这时如果图中有冲突,则按前述方法,如果图中无冲突,则选择成环的最后一条边,即产生环路的边。
原文地址:https://www.cnblogs.com/agnes6/p/13687752.html