并查集是一种特殊的数据结构,用于判别哪些元素属于同一类别。
它包括两个操作,即规约合并union以及寻找类别find。
下面是一道题目:
百度全体员工玩分组游戏,前面五分钟大家分头找队友,并将每个人找到的队友信息汇报给主持人,如果A和B是队友,B和C是队友,那么A和C也是队友;接着主持人不断地随机抽取两个人,希望判断二者是否为队友。请设计一个计算机程序辅助主持人判断两个人是否为队友。
对于这个题目,我们只需算出,哪些队员属于某一类即可。这就是并查集的典型运用。
package com.Algorithm.DisjointSet;
import java.util.*;
/*
* author:Tammy Pi
* function:并查集
*/
public class DisjointSet {
private String[] people={"小明","小王","小军","小丽","小李"};
private int[] s=new int[people.length];
//构造函数,初始化
public DisjointSet()
{
for(int i=0;i<s.length;i++)
{
s[i]=-1;
}
}//DisjointSet
//归并
public void union(int i,int j)
{
if(s[i]==-1&&s[j]==-1)
{
s[i]=Math.max(i,j);
s[j]=Math.max(i,j);
}
else if(s[i]!=-1)
{
s[j]=s[i];
}
else if(s[j]!=-1)
{
s[i]=s[j];
}
else
{
int temp=Math.max(s[i],s[j]);
s[i]=temp;
s[j]=temp;
}
}
//寻找
public int find(int i)
{
if(s[i]<0)
{
return i;
}
return s[i];
}
public int[] getS()
{
return this.s;
}
public String[] getPeople()
{
return this.people;
}
public static void main(String[] args)
{
DisjointSet disjoint=new DisjointSet();
//<小明,小王>
disjoint.union(0,1);
//<小军,小王>
disjoint.union(2,1);
//<小丽,小李>
disjoint.union(3,4);
for(int i=0;i<disjoint.getS().length;i++)
{
System.out.println(disjoint.getPeople()[i]+" "+"属于类别:"+disjoint.getS()[i]);
}
}
}