685_冗余连接ⅡC++

本题目由冗余连接Ⅰ变形而来。冗余连接Ⅰ较为简单,判断无向图的冗余的边,以保证去掉冗余的边后剩下的边形成一棵树,这个题目用并查集就能实现:如果两条节点属于同一个子集无法进行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++)
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值