并查集实现Kruscal算法
克鲁斯卡尔算法:克鲁斯卡尔算法是一种用来寻找最小生成树的算法。在剩下的所有未选取的边中,找最小边,如果和已选取的边构成回路,则放弃,选取次小边。
public void kruscal(){
UnionSet unionSet=new UnionSet(vertex.length);
List<Edge> result=new ArrayList<>();
int count=0;
double dis=0.0;
boolean[] visited=new boolean[edges.length];
for(boolean b : visited) b=false;
int index;
while (count<vertex.length-1){
index=getLeastShortEdge(visited);
if(!unionSet.isConnect(edges[index].getU(),edges[index].getV())) {
++count;
unionSet.unite(edges[index].getU(),edges[index].getV());
result.add(edges[index]);
dis+=edges[index].getWeight();
}
visited[index]=true;
}
System.out.println("Kruscal算法生成的最小生成树的边(总权值为"+dis+"):");
for(int i=0;i<result.size();++i) System.out.println(vertex[result.get(i).getU()]+","+vertex[result.get(i).getV()]+","+result.get(i).getWeight());
}
private int getLeastShortEdge(boolean[] visited){
int i=0;
while (visited[i]) ++i;
double tmp=edges[i].getWeight();
int index=i;
while (++i<visited.length){
if(!visited[i]&&edges[i].getWeight()<tmp) {
tmp=edges[i].getWeight();
index=i;
}
}
return index;
}
href: