最小生成树
public class Prim {
public static void main(String[] args) {
System.out.println("请输入图定点个数: ");
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
int n = Integer.parseInt(line);
System.out.println("请输入图的路径长度: ");
int[][] c = new int[n+1][n+1];
for(int i = 0; i < n; i++) {
line = sc.nextLine();
String[] ds = line.split(",");
for(int j = 0;j < ds.length; j++) {
c[i+1][i+1] = Integer.parseInt(ds[j]);
}
}
System.out.println("一次构成树的边为: ");
prim(n,c);
}
public static void prim(int n, int[][] c) {
int[] lowcost = new int[n+1];
int[] closest = new int[n+1];
boolean[] s = new boolean[n+1];
//节点1进入S中,此为初始化
s[1] = true;
//初始化
for(int i = 2; i <= n; i++) {
lowcost[i] = c[1][i];
closest[i] = 1;
s[i] = false;
}
//n-1次遍历,把S空间扩充成V
for(int i = 1;i < n; i++) {
int min = Integer.MAX_VALUE;
int j = 1;
for(int k = 2; k <= n; k++) {
if(lowcost[k] != -1 && lowcost[k] < min && !s[k]) {
min = lowcost[k];
j = k;
}
}
System.out.println(closest[j] + "-" + j);
s[j] = true;
for(int k = 2; k <= n; k++) {
if(!s[k] && c[j][k] != -1) {
if(c[j][k] < lowcost[k] || lowcost[k] == -1) {
lowcost[k] = c[j][k];
closest[k] = j;
}}}}}}
运行结果
`