A bug.s life-并查集
update@2011-09-22
#define MAX 100010
int father[MAX];
int relation[MAX];
int makeSet(int N){
//0表示和根节点的关系是 同类
memset(relation,0,sizeof(relation));
for(int i = 1;i <= N;i++){
father[i] = i;
}
return 1;
}
int findSet(int x){
if(x != father[x]){
int temp = father[x];
father[x] = findSet(father[x]);
relation[x] = (relation[temp]+relation[x])%2;
}
return father[x];
}
int unionSet(int x,int y){
int set_x = findSet(x);
int set_y = findSet(y);
if(set_x != set_y){
father[set_x] = set_y;//将x并入y的集合
relation[set_x] = ((relation[x]+1)%2+ relation[y])%2;
}
return 1;
}
///main函数主要部分
int aa = findSet(a);
int bb = findSet(b);
if(aa != bb){
//不在同一个集合就合并到同一个集合
unionSet(a,b);
}
else if(relation[a] == relation[b]){
//可以情况出现
flag = 1;
}
题目链接:
A bug's life并查集还能这么用,很强大啊。以前写的都是同类之间的合并,而这个是不同类间的合并 同时保存各自和根节点的关系 在findSet回溯的时候更新关系(两种关系就模2,n种关系就模n)....开始觉得非常别扭 写一遍就好了