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
}
java实现Prim算法
猜你喜欢
转载自blog.csdn.net/zyw764662004/article/details/68952869
今日推荐
周排行