今天是leetcode685 冗余连接
- 这题容易想到的是有几种情况能找到多余的边
- 有两条边同时指向某个点(冲突)
- 根节点被某条边指向(成环)
用如下代码记录冲突和环路
if(p[to] != to) {//若该边指向的点已有父点,则产生冲突
con = i;//记录冲突边
}
else {//若该边不是产生冲突的边
p[to] = from;
if(find(to) == find(from)) {
cur = i;//若该边连接的两点经过查询属于同一连通集,则产生环路。
}else {
union(from, to);
}
}
那怎么根据上述两种情况找到满足条件的多余边呢?
- 针对第一种情况,答案肯定是在这两条边中的一个,那么是哪一个呢?
这里又涉及两种情况,图中存在环和不存在环
- 若图中存在环,那么答案一定是两条边中在环上的那一个。然而怎么找到在环上的那一个呢?
导致冲突的那一条边不会被判定成成环,因此是另一条边。
(即使真的有一种情况是冲突和成环是同一边,那也会被判定为无环,而这种情况下就会将这条边作为答案)
- 若图中无环,那就选择这两条边中后出现的那个,也就是记录在案的产生冲突的边。
- 针对第二种情况,图中肯定有环,这时如果图中有冲突,则按前述方法,如果图中无冲突,则选择成环的最后一条边,即产生环路的边。