本题目由冗余连接Ⅰ变形而来。冗余连接Ⅰ较为简单,判断无向图的冗余的边,以保证去掉冗余的边后剩下的边形成一棵树,这个题目用并查集就能实现:如果两条节点属于同一个子集无法进行union,那么连接两个节点的边是冗余的。
冗余连接Ⅱ的改变在于将无向图变为了有向图,因此输入的边中可能存在一个节点有两个父节点,这样的节点称为入度为2,它与两个父节点相连的边肯定有一条是冗余的,因此本题的重点在于如何处理入度为2的节点。
本文的解法分为三个步骤:
1.遍历寻找入度为2的节点
2.按照并查集的方式遍历处理除入度为2的节点以外的边
3.遍历入度为2的节点的对应边
class DisjSets
{
public:
explicit DisjSets(int numElements);
int find(int x);//修改函数-路径压缩
bool addDirectedEdge(int parent, int son);
private:
vector<int> parent;
vector<int> rank;//秩
};
DisjSets::DisjSets(int numElements) :parent(numElements),
rank(numElements, 0)
{
for (int i = 0; i < numElements; i++)