并查集 [修改数组,合根植物]

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

#include<bits/stdc++.h>
using namespace std;

const int N=1.1e6+10;



int sz[N];
int fina(int x){//状态压缩 
if(sz[x]!=x){ //找父点 
sz[x]=fina(sz[x]);
}
return sz[x];
}

int s,A[N],su; 
int main()
{
for(int i=0;i<N;i++){ //并查集初始化 
   sz[i]=i;
}

cin>>s;
for(int i=0;i<s;i++){ //并查集初始化 
  cin>>su;
 
  cout<<sz[fina(su)]<<" "; 
  sz[fina(su)]+=1;//把当前状态往后移一位标识当前点已经指向下一个父类 
  
}

 cout<<endl; 

return 0;
}


#include<bits/stdc++.h>
using namespace std;
 //查找有多少个顶级父类 
const int N=1e6+10;
int sz[N],m,n;
 
 
int ljys(int x){
   if(sz[x]!=x){
   
   
   int lj= ljys(sz[x]);
   
   
   cout<<sz[x]<<"  <- "<<lj<<"    x:"<<x<<endl;
   sz[x]=lj;
   
   
   }
   
   cout<<"x上:"<<x<<"  "<<endl; 
  
  return sz[x];
} 
 

int main()
{
   int sum=0;
cin>>m>>n;

for(int i=1;i<=m*n;i++){
sz[i]=i;
}

int k,a,b;
cin>>k;
for(int i=1;i<=k;i++){
cin>>a>>b;
int a1=ljys(a);
int b1=ljys(b);

cout<<endl;
sz[ljys(a)]=ljys(b);
cout<<"x:"<<a1<<"   <<-> "<<b1<<endl;


//状态转移 
//sz[a]=ljys(b);//状态转移 

for(int i=1;i<=m*n;i++){
cout<<i<<"  ";
}
cout<<endl;

   for(int i=1;i<=m*n;i++){
      if(sz[i]==i){
       sum++;
}
cout<<sz[i]<<"  ";
}

cout<<endl;
}
      
      
//      int sum=0;
//      for(int i=1;i<=m*n;i++){
//      
//      if(sz[i]==i){
//       sum++;
//}
//      
//cout<<sz[i]<<"  ";
//}
//cout<<endl<<sum;
//



return 0;
}


上面的讲的就是并查集 .蛮好的  ,嘿嘿

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6