最小生成树

最小生成树

无向连通带权图:G=(V,E,W),
其中 w(e)属于W是边e的权.
G的一棵生成树T是包含了G的所有顶点的树,树中各边的权之和W(T)称为树的权,具有最小权的生成树称为G的最小生成树。

算法步骤:
• 初始S={1},
• 选择连接S与V-S集合的最短边e={i,j}
• 其中i∈S,j∈V-S。将e加入树T,j加入S。
• 继续执行上述过程,直到S=V为止。、

具体编程中的算法步骤为:
·记录结点1到其他结点的权值到lowcost中,s[0]置true表示该结点(两端都被连接或是开始结点、结束结点)。(连接结点1和与结点1权值最小的边结点。通过直接输出这两个结点的数值)
·从与第一个结点边权值最小的结点出发遍历重复上述步骤,直至全部遍历完。

运行实例:
在这里插入图片描述
伪代码
算法 Prim (G,E,W)
1.S←{1}
2.while V←S不为空do
3. 从V-S中选择 j 使得 j 到 S中顶点的边权最小
4. S←S并{j}

public class min_Tree {
	public static void prim(int n,float [][]c) {
		float []lowcost = new float[n];
		int []closest = new int[n];
		boolean []s=new boolean [n];
		
		s[0]=true;
		for(int i=1;i<n;i++)
		{
			lowcost[i]=c[0][i];
			closest[i]=0;
			s[i]=false;
		}
		//-------
		for(int i=0;i<n-1;i++)
		{
			float min=Float.MAX_VALUE;
			int j=0;
			for(int k=1;k<n;k++)
				if((lowcost[k]<min)&&(!s[k])) 
				{
					min=lowcost[k];
					j=k;
				}
			//int t=j+1;
			System.out.println((j+1)+", "+(closest[j]+1));
			s[j]=true;
			for(int k=1;k<n;k++)
			{
				if((c[j][k]<lowcost[k])&&(!s[k]))
				{
					lowcost[k]=c[j][k];
					closest[k]=j;
				}
			}
			
		}
		
		//-----------
	}
	public static void main(String[] args) {
		float [][]c={{0,6,1,5,Float.MAX_VALUE,Float.MAX_VALUE},
					  {6,0,5,Float.MAX_VALUE,3,Float.MAX_VALUE},
					  {1,5,0,5,6,4},
					  {5,Float.MAX_VALUE,5,0,Float.MAX_VALUE,2},
					  {Float.MAX_VALUE,3,6,Float.MAX_VALUE,0,6},
					  {Float.MAX_VALUE,Float.MAX_VALUE,4,2,6,0}};
		prim(6,c);
	}
}

发布了32 篇原创文章 · 获赞 1 · 访问量 473
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览