import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Prim {
public char[] vexs;//节点
public int vex_number;//节点数
public int edge_number;//边数
public int[][] Matrix;//图矩阵
Scanner input = new Scanner(System.in);
/**
* 创建图
*/
public void initialMatrix(){
//初始化节点,小写字母的节点形式
vexs =new char[] {'a','b','c','d','e','f'};
vex_number = vexs.length;
Matrix = new int[vex_number][vex_number];
//领接矩阵赋初值为0
for (int i=0;i<vex_number;i++){
for (int j=0;j<vex_number;j++){
Matrix[i][j] = 0;
}
}
//初始化边
System.out.println("Please input the number of edges");
edge_number = input.nextInt();
input.nextLine(); //去回车
System.out.println("Please intput the edges like (a b weight)");
char ch_start;
char ch_end;
int weight;
//获取边的信息
for (int i=0;i<edge_number;i++){
String info = input.nextLine();
ch_start = info.charAt(0);
ch_end = info.charAt(2);
weight = Integer.valueOf(info.charAt(4));
//生成矩阵,无向图,矩阵需对称
Matrix[ch_start-'a'][ch_end-'a'] = (weight-'0');
Matrix[ch_end-'a'][ch_start-'a'] = (weight-'0');
}
}
public void prim(List<Integer> temp){
if(temp.size()==vex_number) return;
int MinWeight = 100;
int i=0;
int index_x = 0,index_y=0;
for (i=0;i<temp.size();i++){
int t1 = temp.get(i);
for (int j=0;j<Matrix[t1].length;j++){
//查找temp中的节点所有相邻的且没有被访问过的节点
if(Matrix[t1][j]<MinWeight && Matrix[t1][j]>0 && !temp.contains(j)){
MinWeight = Matrix[t1][j];
index_x = temp.get(i);
index_y = j;
}
}
}
temp.add(index_y);
System.out.printf("%c->%c 权重为:%d\n",(index_x+'a'),(index_y+'a'),MinWeight);
prim(temp);
}
/**
* 显示图的邻接矩阵
*/
public void display(int [][] mar){
System.out.println("图的领接矩阵为");
for (int i=0;i<mar.length;i++){
for (int j=0;j<mar[i].length;j++){
System.out.print(mar[i][j]);
System.out.print(" ");
}
System.out.println("\n");
}
}
public static void main(String [] args){
Prim p = new Prim();
p.initialMatrix();
p.display(p.Matrix);
//用a放已经访问过的节点,起始放0代表a,之后没获取一个最短边,就把对应的节点以数字形式加入到a中
List<Integer> a = new ArrayList<>();
a.add(0);
p.prim(a);
}
}
Prim算法java
猜你喜欢
转载自blog.csdn.net/sinat_40553837/article/details/84192663
今日推荐
周排行