带权图的邻接矩阵中无连接的值为无限大
最小生成树的算法:从一个顶点出发找到其他顶点的所有的边,放入优先列队,找到权值最小的,把它和它所到达的顶点放入树的集合中。再以终点作为源点找到所有到其他顶点的边(不包括已放入树中的顶点),放入优先队列中,再从中取最小的把它
到达的顶点放入树的集合中(最小生成树)。再以终点作为源点找到所有到其他顶点的边(不包括已放入树中的顶点),放到优先队列中,再从中取最小的把它和它所到达的顶点放入树的集合中,反复这样操作到全部顶点都放入到树中为止。
除了图之外,我们还需要优先队列
注意是无向有权图的最小生成树
优先队列存放的是边这个对象。
最小生成树与最短路径是不同的东西
最小生成树返回的是一个顶点序列
带权图结构:边,顶点,优先队列,图
步骤:
初始化当前顶点索引为0
{标志当前顶点正在访问
寻找边插入队列(需要判断是否存在相同终点的边,有的话需要删除和替换)
获取队列中最小的边
输出
改变全局变量当前顶点的值
}循环
public class Edge { //边 public int srcVert;//存放源点的索引值 public int destVert;//存放终点的索引值 public int distance;//边的权值 public Edge(int sv,int dv,int d) { //初始化边 srcVert=sv; destVert=dv; distance=d; } }
public class PriorityQ { //优先队列(优先队列中存放的是边对象) private final int SIZE=20;//队列的总长度(规定边最大的数量) private Edge[] queArray;//存放边对象的数组 private int size;//当前边的数量 public PriorityQ() { queArray=new Edge[SIZE]; //初始化数组 size=0;//初始化边数量为0 } //将边插入边数组中 public void insert(Edge item) { //根据权值将边插入队列中 int j; for(j=0;j<size;j++)//循环数组,找到插入边的位置 if(item.distance>=queArray[j].distance)//如果找到要比姚插入的边权值大的边,就插入该边的后面 break;//记录边的位置,即j //插入(移动和插入) for(int k=size-1;k>=j;k--)//位置后移动 queArray[k+1]=queArray[k]; queArray[j]=item;//