最近上机,实验里老师布置让写用kruskal算法实现,目标明确
可是最后实现的时候,发现我的想法竟然是prim算法
现在写完了,才发现写错了
不过还是想把它发表出来
要不然就没有人知道我曾经写过 呜呜呜~~~
package 最小生成树;
import static java.lang.System.out;
import java.util.*;
/*
* 测试数据
6 10 //结点数 边数
1 2 6 //起点 终点 权值
1 3 1
1 4 5
2 3 5
2 5 3
3 4 5
3 5 6
3 6 4
4 6 2
5 6 6*/
/*
5 7
1 2 10
1 4 30
1 5 100
2 3 50
3 4 20
3 5 10
4 5 60
*/
public class MinTree {
static int[] visit;
static int max = 99999;
static List<Node> list;
static List<Node> minTree;
static int vexnum;
public static void main(String[] args) {
input();
Collections.sort(list);
minSpanningTree();
}
private static void input() {
Scanner scanner = new Scanner(System.in);
out.println("请输入结点的个数和边的条数");
vexnum = scanner.nextInt();
int edge = scanner.nextInt();
visit = new int[vexnum];
list = new ArrayList<Node>();
minTree = 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();
}
/*
* 保证每添加一条边,都会增肌一个未访问的结点 已访问的结点构成一个集合Visit 增加一条边的条件是:构成这条边的两个结点至少有一个不在visit
*/
public static void minSpanningTree() {
for (int i = 0; i < list.size(); ++i)
list.get(i).show();
Node node = new Node(list.get(0).getBegin(), list.get(0).getEnd(), list.get(0).getWeigth());
list.remove(0);
minTree.add(node); //权值最小的边放入集合
visit[node.getBegin()] = 1; //标记最小边对应的两个结点为已访问状态
visit[node.getEnd()] = 1;
for (int i = 1; i < vexnum - 1; ++i) {
int begin = -1;
int end = -1;
int index = -1;
for(int j = 0;j < list.size();++j) {
Node n = list.get(j);
begin = n.getBegin();
end = n.getEnd();
if (visit[begin] == 1 && visit[end] == 0 || visit[begin] == 0 && visit[end] == 1) // 保证至少有一个点是新点
{
index = j;
break;
}
}
Node node1 = new Node(list.get(index).getBegin(), list.get(index).getEnd(), list.get(index).getWeigth());
list.remove(index);
minTree.add(node1);
visit[begin] = 1;//标记新添加的边对应的两个结点为可访问状态
visit[end] = 1;
}
out.println("最小生成树的集合为");
for (int i = 0; i < minTree.size(); ++i)
minTree.get(i).show();
}
}