1 prim算法
class Solution {
public int getValue(){
// 获取信息,得到点与点间的关系
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] lineValue = new int[n+1][n+1];//点与点间的值
int[] minLine = new int[n+1]; //蓝点与红点之间的最小边
boolean[] pointExist = new boolean[n+1];//是否已经进入最小生成树
for (int i = 0; i <=n ; i++) {
for (int j = 0; j <=n ; j++) {
lineValue[i][j] = Integer.MAX_VALUE;
lineValue[j][i] = Integer.MAX_VALUE;
}
}
for (int i = 1; i <= m; i++) {
int first = sc.nextInt();
int second = sc.nextInt();
int value = sc.nextInt();
lineValue[first][second] = value;
lineValue[second][first] = value;
}
for (int i = 0; i <= n; i++) {
minLine[i] = lineValue[1][i];
}
pointExist[1] = true;//从1点开始
//开始生成树
//找蓝点最小边
int cout = 1;
int ans = 0;
while (cout < n){
cout++;
int minPTP = 0;
for (int i = 1; i <=n ; i++) {
if (minLine[i]<minLine[minPTP]&&!pointExist[i])minPTP = i;
}
pointExist[minPTP] = true;
ans += minLine[minPTP];
//更新蓝点与红点间的最小边
for (int i = 1; i <=n; i++) {
if (minLine[i]>lineValue[cout][i])minLine[i] = lineValue[cout][i];
}
}
return ans;
}
}
2 Kruskal算法
class Solution {
class Line /*implements Comparable<Line>*/{ //Line 是点与点之间的连线
int a,b,v;
public Line(int a, int b, int v) {
this.a = a;
this.b = b;
this.v = v;
}
// @Override
// public int compareTo(Line o) {
// return this.v - o.v;
// }
}
int[] father = new int[10000];
public int find(int a){
return father[a]=father[a]==a?a:find(father[a]);
}
public int kruskal(){
// 获取信息,得到点与点间的关系
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); int m = sc.nextInt();
Line[] lineValue = new Line[m];//点与点间的值
for (int i = 1; i < n; i++) father[i] = i;
for (int i = 0; i < m; i++) {
lineValue[i] = new Line(sc.nextInt(),sc.nextInt(),sc.nextInt());
}
int ans = 0;
Arrays.sort(lineValue, (Line o1, Line o2)->o1.v-o2.v);
for (int i = 0; i < m; i++) {
if (find(lineValue[i].a) == find(lineValue[i].b))continue;
else {father[find(lineValue[i].a)] = find(lineValue[i].b);
ans += lineValue[i].v;}
}
return ans;
}
}