关于最小生成树的经典算法一个是普里姆算法,另一个就是克鲁斯卡尔算法,在这里和大家一起讨论,有不对的地方希望大家多多指教,先上图
和普里姆算法用一个数组进行比较不同的是,克鲁斯卡尔算法用的是边进行比较,一条边的起始节点,终端 节点,和边的权值
再按权值的大小对边从小大到进行排序,而克鲁斯卡尔算法的核心思想是,要找到最小的生成树,那么就将边从小到大一条一条加进去,只要碰见加进去会出现回环就加,这样从小到大加的边所生成的树那么就一定是最小生成树,那么该算法的核心就是如何判断是否会出现回环,下面请看算法的java实现版
public class GraphKruskal { private Edge[] edges; private int edgeSize; public GraphKruskal(int edgeSize) { this.edgeSize = edgeSize; edges = new Edge[edgeSize]; } public void miniSpanTreeKruskal(){ int m,n,sum=0; int[] parent = new int[edgeSize];//神奇的数组,下标为起点,值为终点 for(int i = 0 ;i<edgeSize;i++){ parent[i] = 0; } for(int i = 0;i<edgeSize;i++){ n = find(parent,edges[i].begin); m = find(parent,edges[i].end); if(n!=m){ parent[n] = m;