【模板】数据结构 - 并查集

本文深入探讨并查集数据结构的实现与应用,通过C++代码详细解析其构造、查找与合并操作,同时提供了测试代码示例,帮助读者理解并查集在解决连通性问题中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码:

//4.2 并查集
struct DisjointSet {
	vector<int>father, rank;
	DisjointSet(int n) :father(n + 1), rank(n + 1) {
		for (int i = 1; i <= n; ++i) {
			father[i] = i;
		}
	}

	int find(int v) {
		return father[v] = (father[v] == v ? v : find(father[v]));
	}

	void merge(int x, int y) {
		int a = find(x), b = find(y);
		if (rank[a] < rank[b]) {
			father[a] = b;
		}
		else {
			father[b] = a;
			if (rank[a] == rank[b]) {
				++rank[a];
			}
		}
	}
};

其他:

  1. 结点下标从1开始,从0开始要做适当修改
  2. 结点a,b属于同一连通分支,等价于find(a)==find(b),而不是father[a]==father[b]
  3. rank数组未必实际反映树高
  4. 附测试代码
    #include<bits/stdc++.h>
    using namespace std;
    
    /**/
    
    int main() {
    	int n, m;
    	scanf("%d%d", &n, &m);
    	DisjointSet djs(n);
    	printf("i=%d\n  ", 0);
    	for (int j = 1; j <= n; ++j) {
    		printf("%d ", djs.father[j]);
    	}
    	for (int i = 1; i <= m; ++i) {
    		int a, b;
    		scanf("%d%d", &a, &b);
    		djs.merge(a, b);
    		printf("i=%d\n  ",i);
    		for (int j = 1; j <= n; ++j) {
    			printf("%d ", djs.father[j]);
    		}
    		printf("\n");
    	}
    
    	return 0;
    }

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值