quick find
//
// Created by cry on 2024/4/10.
//
// 1. quickfind联通判断快,合并操作慢
// 2. 只需要知道一个点与哪些点颜色相同
// 3. 若干点的颜色可以通过间接指向同一个节点
// 4. 合并:将一棵树作为另一棵树子树
#include <iostream>
using namespace std;
#define MAX_N 1000
int color[MAX_N+5];
void init(int n){
for(int i=0;i<=n;i++){
color[i]=i;
}
return ;
}
//连通性判断
int find(int a){
return color[a];
}
int merge(int a,int b,int n){
int aa=find(a),bb=find(b);
if(aa==bb){ //已经在一个集合中了
return 0;
}
//连通
for(int i=0;i<=n;i++)//将aa全染成bb
{
if(color[i]==aa){
color[i]=bb;
}
}
return 1;
}
void output(int n){
int ret=0;
for(int i=0;i<=n;i++){
ret+=printf("%3d",i);
}
printf("\n");
for(int i=0;i<ret;i++){
printf("-");
}
printf("\n");
for(int i=0;i<=n;i++){
printf("%3d",color[i]);
}
printf("\n");
return ;
}
void acm_1_10_bingchaji_QuickFind_test(){
int n;
cin >>n;
init(n);
int a,b;
while(cin >>a >>b){
printf("merge %d with %d:%d\n",a,b,merge(a,b,n));
output(n); //输出每个点的颜色
}
}