文章目录
- [prim算法精讲 卡码网 53. 寻宝(第七期模拟笔试)](#prim算法精讲 卡码网 53. 寻宝(第七期模拟笔试))
- [kruskal算法精讲 53. 寻宝(第七期模拟笔试)](#kruskal算法精讲 53. 寻宝(第七期模拟笔试))
prim算法精讲 卡码网 53. 寻宝(第七期模拟笔试)
java
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int V = sc.nextInt();
int E = sc.nextInt();
int[][] grid = new int[V + 1][V + 1];
for (int i = 0 ; i <= V; i++) {
Arrays.fill(grid[i], Integer.MAX_VALUE);
}
for (int i = 0; i < E; i++) {
int s = sc.nextInt();
int t = sc.nextInt();
grid[s][t] = sc.nextInt();
grid[t][s] = grid[s][t];
}
int[] minDist = new int[V + 1];
Arrays.fill(minDist, Integer.MAX_VALUE);
boolean[] isTree = new boolean[V + 1];
for (int i = 1; i < V; i++) {
int minvalue = Integer.MAX_VALUE;
int cur = 1;
for (int j = 1; j <= V; j++) {
if (!isTree[j] && minDist[j] < minvalue) {
minvalue = minDist[j];
cur = j;
}
}
isTree[cur] = true;
for (int j = 1; j <= V; j++) {
if (isTree[j] == false && grid[cur][j] < minDist[j]) {
minDist[j] = grid[cur][j];
}
}
}
int result = 0;
for (int i = 2; i <=V; i++) {
result += minDist[i];
}
System.out.println(result);
}
}
kruskal算法精讲 53. 寻宝(第七期模拟笔试)
java
import java.util.*;
class Edge {
int l, r, val;
public Edge(int l, int r, int val) {
this.l = l;
this.r = r;
this.val = val;
}
}
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int v = sc.nextInt();
int e = sc.nextInt();
List<Edge> edges = new ArrayList<>();
for (int i = 0; i < e; i++) {
int v1 = sc.nextInt();
int v2 = sc.nextInt();
int val = sc.nextInt();
edges.add(new Edge(v1, v2, val));
}
edges.sort(Comparator.comparingInt(edge -> edge.val));
int res = 0;
DisJoint disjoint = new DisJoint(v + 1);
for (Edge edge : edges) {
int x = disjoint.find(edge.l);
int y = disjoint.find(edge.r);
if (x != y) {
res += edge.val;
disjoint.join(x, y);
}
}
System.out.println(res);
}
}
class DisJoint {
private int[] father;
public DisJoint(int N) {
father = new int[N + 1];
for (int i = 0; i <= N; i++) {
father[i] = i;
}
}
public int find(int n) {
return father[n] == n ? n : (father[n] = find(father[n]));
}
public void join(int n, int m) {
n = find(n);
m = find(m);
if (n == m) {
return;
}
father[n] = m;
}
public boolean isSame(int n, int m) {
return find(n) == find(m);
}
}