藍橋杯-並查集-合根植物

DawnTraveler發表於2024-04-12

0.題目

1.解析

1.1 並查集

思路

主要三大模板功能 1.初始化(init) 2.尋找父節點(find) 3.合併(merge)
我們在find中可以使用路徑壓縮簡化運算,縮短執行時間由O(n)到 o(logn)

程式碼

#include<bits/stdc++.h>
using namespace std;
const int Maxn = 1e6 + 10;
int fa[Maxn+1];
int m, n, k; 
// 初始化操作 
void init(){
	for(int i = 1; i <= Maxn; i++){
		fa[i] = i;	
	}	
}

// 尋找父節點(DFS遞迴) 
//int find(int x){
//	// 找到根節點 
//	if(x == fa[x]){
//		return x;
//	}
//	// 沒有找到,繼續向前DFS遞迴 
//	else{
//		return find(fa[x]);
//	} 
//}

// 尋找父節點(路徑壓縮) 
int find(int x){
	// 找到根節點 
	if(x == fa[x]){
		return x;
	}
	// 沒有找到,繼續向前DFS遞迴 
	else{
		fa[x] = find(fa[x]); 
		return fa[x];
	} 
}

// 合併操作(根節點合併)
void merge(int x, int y){
	fa[find(x)] = find(y);
}


int main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> n >> m >> k;
	init(); 
	for(int i = 0; i < k; i++){
		int a, b;
		cin >> a >> b; 
		merge(a, b);
	}
	
	int ans = 0;
	for(int i = 1; i <= n*m; i++){
		if(fa[i] == i){
			ans++;
		}
	}
	cout << ans;
	return 0;
}