Prim和Kruskal算法

Prim和Kruskal算法

通过让边类实现comparable接口实现排序,treeSet可以排序并且去重

结点类

class Vertex {
		String name;// 顶点名称
		Edge next;// 下一条边(第一个为顶点 后面都是边)

		public Vertex(String name) {
			this.name = name;
		}

		// 获取结点的出边
		public TreeSet<Edge> outEdges() {
			//List<Edge> list = new LinkedList<>();
			TreeSet<Edge> treeSet = new TreeSet<>();
			Edge edge = this.next;
			while (edge != null) {
				treeSet.add(edge);
				edge = edge.next;
			}
			//Collections.sort(treeSet);
			return treeSet;
		}

		@Override
		public String toString() {
			return "Vertex [name=" + name + "]";
		}

	}

边类

class Edge implements Comparable<Edge>{
		String name;// 指向的顶点名称
		int weight;// 权值
		Edge next;// 下一条边(链表上)

		public Edge(String name, int weight) {
			this.name = name;
			this.weight = weight;
		}

		@Override
		public String toString() {
			return "Edge [name=" + name + ", weight=" + weight + "]";
		}

		@Override
		public int compareTo(Edge o) {
			if(this.weight!=o.weight)
				return this.weight-o.weight;
			else
				return this.name.compareTo(o.name);
		}
	}

Prim算法

/**
	 * 普利姆算法
	 * @param name 开始结点
	 * @return
	 */
	public Set<Edge> prim(String name) {
		Set<Vertex> addVertex = new HashSet<>();//存放经过的结点
		Set<Edge> addEdge = new HashSet<>();//存放经过的边
		Vertex beginVertex = vertexMap.get(name);
		if (beginVertex.next == null)
			return null;
		addVertex.add(beginVertex);
		TreeSet<Edge> treeSet = new TreeSet<>(beginVertex.outEdges());
		while(!treeSet.isEmpty()&&addVertex.size()<vertexMap.size()) {
			Edge edge = treeSet.pollFirst();
			if(addVertex.contains(vertexMap.get(edge.name))) continue;
			addEdge.add(edge);
			addVertex.add(vertexMap.get(edge.name));
			treeSet.addAll(vertexMap.get(edge.name).outEdges());
		}
		return addEdge;
	}

Kruskal算法

public Set<Edge> kruskal(){
		TreeSet<Edge> allEdges = getAllEdges();
		int size=vertexMap.size()-1;
		if(size==-1) return null;
		HashSet<Edge> addEdge = new HashSet<>();
		UnionFind<Vertex> uf = new UnionFind<>();
		Iterator<Vertex> it = vertexMap.values().iterator();
		while(it.hasNext()) {
			uf.makeSet(it.next());
		}
		while(!allEdges.isEmpty()&&addEdge.size()<size) {
			Edge edge = allEdges.pollFirst();
			if(uf.isSame(vertexMap.get(edge.beginName), vertexMap.get(edge.endName))) continue;
			addEdge.add(edge);
			uf.union(vertexMap.get(edge.beginName), vertexMap.get(edge.endName));
		}
		return addEdge;
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值