首先要先说明一下其实这种最小生成树问题的作用领域感觉还是比较实际的,意思就是在已知的坐标位置上进行生成最小生成树而这生成树能使得整体的距离之和最小,如果在现实生活中的话就是能够使得已有的位置之间建立的完整道路线最短,相应的费用就最低!!!
1.直接进行贪婪选择说明
如图中所示,一开始先给定了起始点(就是生成树的根),然后将位置记录下来,然后遍历剩下的位置,看看哪些位置在跟位置的附近,然后找出其中权值最小的,记录第二个位置以及相应的权值;(每次都要将位置点放在一个集合中,记该集合为U)然后再比遍历剩下的点中哪些点在已有集合U中位置点附近的,找出权值最小的,再记录下该位置点以及权值,位置点还是要放在集合U中,多次循环直到所有的点全部放到集合U中,就说明生成树已经OK!
算法伪代码:
MST-PRIM(G,w,r)
1. U<-{r}
2. T<-NULL
3. Q<-V-{r}
4. while Q!=NULL
5. do (u,v)<-集合除去U点外剩下的点中在其附近且权值最小
6. T<-T合并(u,v)//记录权值
7. U<-U合并v //记录位置点
8. Q<-Q-v //除去被记录的点
9. return T
JAVA:
Greater.java
package Jamin;
import java.util.Comparator;
public class Greater implements Comparator<Comparable>{
public int compare(Comparable x,Comparable y) {
return x.compareTo(y);
}
}
Less.java
package Jamin;
import java.util.Comparator;
public class Less implements Comparator<Comparable>{
public int compare(Comparable x,Comparable y) {
return y.compareTo(x);
}
}
LinearList.java
package Jamin;
import java.util.*;
public class LinearList {
public static int partition(List<Comparable> a,int p,int r,Comparator comp)//如果要对集合对象或数组对象进行排序,需要实现Comparator接口以达到我们想要的目标。
{
Comparable x;
int i,j;
x=a.get(r);
i=p-1;
for(j=p;j<r;j++)
if(comp.compare(a.get(j), x)<=0) {//如果不符合规则比较则为-1,符合则为1
i++;
Collections.swap(a, i, j);
}
Collections.s