prim算法是用来求最小生成树(MST)的一种算法,本质是贪心。
Java版算法实现如下
import java.util.*;
/**
* @desc 使用acwing(oj)用的模板
*/
public class Main {
//定义容器、常数、读入
int N = 510;
int INF = 0x3f3f3f3f;
int[][] g = new int[N][N];
boolean[] S = new boolean[N];
int[] dist = new int[N];//点到S的距离
Scanner jin = new Scanner(System.in);
int n,m;
//oj要用的main方法
public static void main(String[] args) {new Main().run();}//在oj中调用题解方法
void run() {
//读入题目数据
n = jin.nextInt();
m = jin.nextInt();
Arrays.fill(dist,INF);
for(int i = 1; i <= n; i++){
Arrays.fill(g[i],INF);
}
while(m-- > 0){
int a = jin.nextInt();
int b = jin.nextInt();
int w = jin.nextInt();
g[a][b] = Math.min(w,g[a][b]);
g[b][a] = Math.min(w,g[b][a]);
}
//调用解题方法
int ans = prim();
//输出题解答案
if(ans != INF) System.out.print(ans);
else System.out.print("impossible");
}
//dist[i]是个点i到集合s的距离(点i不在集合内)
//选择min的dist[i]加入到集合s中,即S[i]=true && res += dist[i],
//然后更新dist[]的数值,因为集合内加入了点i,因此只要比对其他点到i的距离和之前到集合的距离即可。
//即dist[j] = Math.min(dist[j], g[j][i]);
int prim(){
int res = 0;
int num = n;
while(num-- > 0){
int t = -1;
for(int i = 1; i <= n; i++){
if(!S[i] && (t == -1 || dist[t] > dist[i])){//寻找图外点中距离S集合最近的点,自变量名为t;
//!S[i]指点i不可在S集合中,即i为S集合外的点;t=-1指先把t赋予S外集合内的任意一点;比较为求的最小值
t = i;//赋值
}
}
if(t != 1 && dist[t] == INF) return INF;//非连通图
if(dist[t] != INF) res += dist[t];
S[t] = true;
for(int j = 1; j <= n; j++){
dist[j] = Math.min(dist[j], g[j][t]);
}
// return INF;
}
return res;
}
}