主程序中代码
package 最小生成树;
import static java.lang.System.out;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class MinTree {
static int vexnum;
static List<Node> list;
static int[] parent;
public static void main(String[] args) {
input();
Collections.sort(list);
minSpanningTree();
}
public static void minSpanningTree() {
for (int i = 0; i < list.size(); ++i)
list.get(i).show();
for (int i = 0; i < vexnum; ++i) {
Node node = list.get(i);
int begin = node.getBegin();
int end = node.getEnd();
if (!checkConnect(begin, end)) { // 这条边的两个结点,同属于不同的连通分支
setRoot(begin, end);
out.println("begin = " + begin + " end = " + end);
}
}
for (int num : parent)
out.println(num);
}
private static void setRoot(int begin, int end) {
int P = parent[begin];
while (P != parent[P])
P = parent[P];
parent[P] = end;
}
private static boolean checkConnect(int begin, int end) {
while (parent[begin] != begin)
begin = parent[begin];
while (parent[end] != end)
end = parent[end];
return begin == end;
}
private static void input() {
Scanner scanner = new Scanner(System.in);
out.println("请输入结点的个数和边的条数");
vexnum = scanner.nextInt();
parent = new int[vexnum];
for (int i = 0; i < parent.length; ++i)
parent[i] = i;
int edge = scanner.nextInt();
list = new ArrayList<Node>();
out.println("请成对输入结点及边对应的权值");
int begin = 0, end = 0, weight = 0;
for (int i = 0; i < edge; ++i) {
begin = scanner.nextInt();
end = scanner.nextInt();
weight = scanner.nextInt();
Node node = new Node(begin - 1, end - 1, weight);
list.add(node); // 将每一条边做为一个结点存储(起始点,结束点,权重)方便排序
}
scanner.close();
}
}
我选择将每条边看成一个"结点"
边的类型定义
package 最小生成树;
import static java.lang.System.out;
public class Node implements Comparable<Node> {
private int begin;
private int end;
private int weight;
public Node(int begin, int end, int weight) {
super();
this.begin = begin;
this.end = end;
this.weight = weight;
}
@Override
public int compareTo(Node o) {
if (weight > o.weight) {
return 1;
} else if (weight < o.weight) {
return -1;
}
return 0;
}
public void show() {
out.println("begin = " + begin + " end = " + end + " weight = " + weight);
}
public int getBegin() {
return begin;
}
public int getEnd() {
return end;
}
public int getWeigth() {
return weight;
}
}