package com.xjj.Ah;
import java.util.Scanner;
/*-----Prim--最小生成树--类Dij-----
* 1. 任意从一个点出发开始构造生成树,用book[]来标记哪些点已经加入生成树
* 用dis[]来记录生成树到各个顶点的距离,从dis[]中选出离生成树最近的顶点(temp),加入到生成树,
* 在以temp为之间点,更新生成树到每一个非生成树顶点的距离(即dis[k]>e[temp][k])...
*
*
*
* */
public class Ah_8_2 {
private static int N; //点数
private static int M; //边数
public int[][] edge = new int[N+1][N+1]; //边信息数组
public int[] dis = new int[N+1]; //距离数组
public int[] book = new int[N+1]; //标记数组
//Prim算法
public void prim(int start){
int count = 1,temp = 0,sum = 0;
book[start] = 1;
while(count < N){
int min = 99999999;
//更新点
for(int i = 1; i <= N; i++)
//未被标记且到生成树有最小边
if (book[i] == 0 && dis[i] < min) {
min = dis[i];
temp = i;
}
//作为中间标记
book[temp] = 1;
count++;
sum += dis[temp];
//以该中间点作为中介
for(int k = 1; k <= N; k++)
if (book[k] == 0 && dis[k] > edge[temp][k])
dis[k] = edge[temp][k];
}
System.out.println("最小生成树为: " + sum);
}
public static void main(String[] args) {
System.out.println("输入点及边数:");
Scanner scanner = new Scanner(System.in);
N = scanner.nextInt();
M = scanner.nextInt();
Ah_8_2 ah = new Ah_8_2();
//初始化
for(int i = 1; i <= N; i++)
for(int j = 1; j <= N; j++)
if (i != j) {
ah.edge[i][j] = 99999999;
}
//输入树
for(int i = 1; i <= M; i++){
int a = scanner.nextInt();
int b = scanner.nextInt();
int c = scanner.nextInt();
ah.edge[a][b] = c;
ah.edge[b][a] = c;
}
//对dis[]初始化
for(int i = 1; i <= N; i++)
ah.dis[i] = ah.edge[1][i];
ah.prim(1);
}
}
Prim--最小生成树--类Dij
最新推荐文章于 2022-03-13 00:01:48 发布