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

 

posted @ 2017-08-08 12:57  浅忆~  阅读(227)  评论(0)    收藏  举报