java最小生成树--prim算法实现

最近上机,实验里老师布置让写用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();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值