说明
- 利用克鲁斯卡尔算法
- 打印出各连通分类的边集
- 要是连通图才能生成最小生成树
运行截图

代码实现
import java.util.*;
public class MinSpanTreeTest {
public static void main(String[] args) {
MinSpanTree minSpanTree = new MinSpanTree();
minSpanTree.CreatGraph();
minSpanTree.Kruskal();
}
}
class Vertex{
String vername;
}
class Edge{
int a,b;
int weight;
}
class MinSpanTree{
private ArrayList<Vertex> vertices = new ArrayList<>();
private Edge[] edges;
private int VerNum;
private int EdgeNum;
public int find(String vername){
for (int i=0;i<VerNum;i++){
if (vertices.get(i).vername.equals(vername))
return i;
}
return -1;
}
public void CreatGraph(){
Scanner in = new Scanner(System.in);
System.out.println("输入顶点的数量");
VerNum = in.nextInt();
System.out.println("输入弧的数量");
EdgeNum =in.nextInt();
edges = new Edge[EdgeNum];
System.out.println("输入各个顶点的名称");
for (int i=0;i<VerNum;i++){
Vertex vertex = new Vertex();
vertex.vername = in.next();
vertices.add(vertex);
}
System.out.println("依次输入各条弧的两个顶点和权值");
for (int i=0;i<EdgeNum;i++){
String a = in.next();
String b = in.next();
int weight = in.nextInt();
int aIndex=find(a);
int bIndex=find(b);
if (aIndex==-1||bIndex==-1){
System.out.println("顶点名称输入错误,请重新输入");
i--;
continue;
}
else{
Edge edge = new Edge();
edge.a = aIndex;
edge.b = bIndex;
edge.weight =weight;
edges[i] = edge;
}
}
Arrays.sort(edges, new Comparator<Edge>() {
@Override
public int compare(Edge o1, Edge o2) {
return o1.weight-o2.weight;
}
});
}
int [] parent;
int [] child ;
public int findRoot(int child){
if (parent[child]==child)
return child;
parent[child] = findRoot(parent[child]);
return parent[child];
}
boolean unionTree(Edge e){
int root1;
int root2;
root1 = findRoot(e.a);
root2 = findRoot(e.b);
if (root1!=root2){
if (child[root1]>child[root2]){
parent[root2]=root1;
child[root1]+=child[root2]+1;
}
else{
parent[root1]=root2;
child[root2]+=child[root1]+1;
}
return true;
}
return false;
}
public void Kruskal(){
parent = new int[VerNum];
child = new int[VerNum];
for (int i=0;i<VerNum;i++){
parent[i]=i;
child[i]=0;
}
int count=0;
System.out.println("最小生成树的各边及其对应的权值为");
for (int i=0;i<EdgeNum;i++){
if (unionTree(edges[i])==true){
Vertex vertex1 = vertices.get(edges[i].a);
Vertex vertex2 = vertices.get(edges[i].b);
System.out.println(vertex1.vername+"--"+vertex2.vername+" "+edges[i].weight);
count++;
}
if (count==VerNum-1){
break;
}
}
if(count!=VerNum-1){
System.out.println("该图为非连通图,无法构成最小生成树");
}
}
}