最小生成树之Kruskals算法的实现
- 首先要实现图的封装
package _7图;
public class Edge<T>implements Comparable<Edge> {
private T start ;
private T end;
private int distance;
public Edge(T start, T end, int distance) {
this.start = start;
this.end = end;
this.distance = distance;
}
@Override
public int compareTo(Edge obj) {
int targetDis = obj.getDistance();
return distance > targetDis ? 1 : (distance == targetDis ? 0 : -1);
}
public T getStart() {
return start;
}
public void setStart(T start) {
this.start = start;
}
public T getEnd() {
return end;
}
public void setEnd(T end) {
this.end = end;
}
public int getDistance() {
return distance;
}
public void setDistance(int distance) {
this.distance = distance;
}
}
- Kruskals算法实现 细节过程如下
package _7图;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class _5Kruskal {
private final List<Edge> edgeList;
private final int n;
private Set<Edge>T =new HashSet<>();
private Map pntAndNode=new HashMap();
public Set<Edge>getT(){
buildMST();
return T;
}
private void buildMST() {
Collections.sort(edgeList);
for(Edge e:edgeList) {
if(!ok(e)) {
continue;
}
T.add(e);
if(T.size()==n-1) {
return ;
}
}
}
private boolean ok(Edge e) {
UnionFind.UFNode x=(UnionFind.UFNode)pntAndNode.get(e.getStart());
UnionFind.UFNode y=(UnionFind.UFNode)pntAndNode.get(e.getEnd());
if(UnionFind.find(x)!=UnionFind.find(y)) {
UnionFind.union(x, y);
return true;
}
return false;
}
public _5Kruskal(List<Edge> edgeList, int n) {
this.edgeList = edgeList;
for(Edge edge:edgeList) {
pntAndNode.put(edge.getStart(), new UnionFind.UFNode());
pntAndNode.put(edge.getEnd(),new UnionFind.UFNode());
}
this.n = n;
}
public static void main(String[] args) {
List<Edge>edgeList=build();
_5Kruskal obj=new _5Kruskal(edgeList, 5);
int distance=0;
for(Edge e:obj.getT()) {
System.out.println(e.getDistance());
distance+=e.getDistance();
}
System.out.println("总的权值是:"+distance);
}
private static List<Edge> build(){
List<Edge>l=new ArrayList();
l.add(new Edge("C","D", 1));
l.add(new Edge("C","A",1));
l.add(new Edge("C","E",8));
l.add(new Edge("A","B",3));
l.add(new Edge("D","E",3));
l.add(new Edge("B","E",5));
l.add(new Edge("B","E",6));
l.add(new Edge("B","D",7));
l.add(new Edge("A","D",2));
l.add(new Edge("A","E",9));
return l;
}
}
class UnionFind{
public static UFNode find(UFNode x) {
UFNode p=x;
Set<UFNode>path =new HashSet<>();
while(p.parent!=null) {
path.add(p);
p=p.parent;
}
for(UFNode pp:path) {
pp.parent=p;
}
return p;
}
public static void union(UFNode x,UFNode y) {
find(y).parent=find(x);
}
public static class UFNode{
UFNode parent;
}
}