basic code
/*
带权并查集
带权值的并查集只不过是在并查集中加入了一个value[]数组
value[]可以记录很多东西,也可是类似距离这种东西,也可以是相对于根节点的状态
加入了权值,相对于并查集函数有些改变
*/
1 int findfat(int x){ 2 if(fat[x]==x) return x; 3 int temp=fat[x]; 4 fat[x]=findfat(fat[x]); 5 //在此处修改val比如 6 value[x]=value [temp]+1; 7 return fat[x]; 8 }
1 /* 2 #include <iostream> 3 #include <stdio.h> 4 using namespace std; 5 int main(){ 6 int n,m; 7 scanf("%d %d",&n ,&m); 8 char a; 9 for(int i=0;i<n;i++) 10 for(int k=0;k<m;k++) 11 scanf("%c",&a); 12 printf("%c",a); 13 return 0; 14 } 15 */
1 #include <bits/stdc++.h> 2 using namespace std; 3 const manx=1e7+10; 4 int pre[maxn]; 5 int Find( int x){ //递归的路径压缩 6 return pre[x]==x?x:pre[x]=Find(pre[x]); 7 } 8 9 int Find(int x){ 10 if(pre[x]!=x) pre[x]=Find(pre[x]); 11 return pre[x]; 12 } 13 14 int Find(int x){ 15 int p,tmp; 16 p=x; 17 while(x!=pre[x]) 18 x=pre[x]; 19 while(p!=x){ 20 tmp=pre[p]; 21 pre[p]=x; 22 p=tmp; 23 } return x; 24 } 25 26 void Union(int x,int y){ 27 int p=Find(x),q=Find(y); 28 if(p!=q) pre[p]=q; 29 } 30 31 int check(int x,int y){ 32 int p=Find(x),q=Find(y); 33 if(x==y) return 1; 34 else return 0; 35 } 36 37 int main(){ 38 for(int i=0;i<maxn;i++) 39 pre[i]=i; //初值就是本身 40 41 return 0; 42 }