java实现Prim算法

import java.util.Scanner;


public class Main {

	/**
	 * @param args
	 */
	public static int arc[][];//邻接矩阵
	public static int vertex;//vertex*vertex的矩阵
	public static void main(String[] args) {//Prim算法
		// TODO Auto-generated method stub
		init();
		ShortEdge shortEdge[]=new ShortEdge[vertex];
		for(int i=0;i<vertex;i++)
			shortEdge[i]=new ShortEdge();
		shortEdge[0].adjvex=0;
		shortEdge[0].lowcost=0;//将0放入集合U
		for(int i=1;i<vertex;i++){
			shortEdge[i].lowcost=arc[0][i];//因为U里只有v0,所以最小边是vi到v0的值
			shortEdge[i].adjvex=0;//邻接点置为0
			
		}
		for(int i=1;i<vertex;i++){//共做vertex-1次循环,输出vertex-1条边
			int k=0;
			int num=1000;
			for(int j=0;j<vertex;j++){//找到距离当前集合U最近的点k
				if(shortEdge[j].lowcost==0)
					continue;
				if(shortEdge[j].lowcost<num)
					{
						k=j;
						num=shortEdge[j].lowcost;
					}
					}
			
			System.out.println("("+shortEdge[k].adjvex+","+k+")"+shortEdge[k].lowcost);
			shortEdge[k].lowcost=0;//lowcost置0表示将k置入U
			for(int j=1;j<vertex;j++){//U重置以后,遍历所有点与新增点k的距离,如果与原集合的距离小于与k的,则替换
				if(arc[k][j]<shortEdge[j].lowcost){
					shortEdge[j].lowcost=arc[k][j];
					shortEdge[j].adjvex=k;
				}
			}
			
			
		}
	}
	
	
	
	static void init(){//初始化
		Scanner sc=new Scanner(System.in);
		vertex=sc.nextInt();
		arc=new int[vertex][vertex];
		for(int i=0;i<vertex;i++)
			for(int j=0;j<vertex;j++)
				arc[i][j]=sc.nextInt();
	}

}


	class ShortEdge{
		public int lowcost;//记录点i到当前生成树U的最小路径
		public int adjvex;//记录在当前生成树U中到点i最近的点adjvex
		
	}

猜你喜欢

转载自blog.csdn.net/zyw764662004/article/details/68952869