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;
}