最小生成树

Prim

import java.util.ArrayList;
import java.util.List;

public class Prim {
	
	int[][] map;//模拟图
	int[] vis;
	int n;
	
	public static void main(String[] args) {
		Prim p=new Prim();
		p.init();
		System.out.println(p.prim());
	}
	
	void init() {
		n=6;
		vis=new int[n];
		map= new int[][]{
            {0, 6, 1, 5, 0, 0},
            {6, 0, 5, 0, 3, 0},
            {1, 5, 0, 5, 6, 4},
            {5, 0, 5, 0, 0, 2},
            {0, 3, 6, 0, 0, 6},
            {0, 0, 4, 2, 6, 0}
		};
	}
	
	int prim() {
		List<Integer> list=new ArrayList<>();
		int x=0;//起始点
		int ans=0;//
		
		for (int i = 0; i < n-1; i++) {
			list.add(x);
			vis[x]=1;
			int m=Integer.MAX_VALUE;
			for (Integer j : list) {
				for (int k = 0; k < n; k++) {
					if(vis[k]==0) {
						if(map[j][k]>0&&map[j][k]<m) {
							m=map[j][k];
							x=k;
						}
					}
				}
			}
			ans+=m;
		}
		return ans;
	}
}

Kruskal:

package 最小生成树;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Kruskal {
	int[][] map;// 模拟图
//	int[] vis;
	int n;
	List<edge> list = new ArrayList<>();
	int[] parent;
	int[] rank;

	public static void main(String[] args) {
		Kruskal p = new Kruskal();
		p.init();
		System.out.println(p.kruskal());
	}

	void init() {
		n = 6;
//		vis=new int[n];
		parent = new int[n];
		rank = new int[n];
		for (int i = 0; i < n; i++) {
			parent[i] = i;
		}
		map = new int[][] { { 0, 6, 1, 5, 0, 0 }, { 0, 0, 5, 0, 3, 0 }, { 0, 0, 0, 5, 6, 4 }, { 0, 0, 0, 0, 0, 2 },
				{ 0, 0, 0, 0, 0, 6 }, { 0, 0, 0, 0, 0, 0 } };
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (map[i][j] > 0) {
					list.add(new edge(i, j, map[i][j]));
				}
			}
		}
		Collections.sort(list, new Comparator<edge>() {

			@Override
			public int compare(edge o1, edge o2) {
				// TODO Auto-generated method stub
				return o1.val - o2.val;
			}
		});
	}

	int find(int x) {
		return parent[x] == x ? x : (parent[x] = find(parent[x]));
	}

	boolean merge(int x, int y) {
		int a = find(x), b = find(y);
		if (a != b) {
			if (rank[a] <= rank[b])
				parent[a] = b;
			else
				parent[b] = a;
			if (rank[a] == rank[b])
				rank[b]++;
			return true;
		}
		return false;
	}

	int kruskal() {
		int ans=0;
		for (edge edge : list) {
			if(merge(edge.x,edge.y)) {
				ans+=edge.val;
			}
		}
		return ans;
	}

	class edge {
		int x;
		int y;
		int val;

		public edge(int x, int y, int val) {
			this.x = x;
			this.y = y;
			this.val = val;
		}

		public edge() {
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值