C++ 代码到 Java 代码的转换:最小生成树问题
import java.util.Arrays; import java.util.Scanner;
public class Main {
static class Edge implements Comparable
public Edge(int u, int v, int g, int s) {
this.u = u;
this.v = v;
this.g = g;
this.s = s;
}
@Override
public int compareTo(Edge o) {
return this.g - o.g;
}
}
static int[] fa;
static int[] st;
static int top;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
long wg = scanner.nextLong();
long wS = scanner.nextLong();
Edge[] a = new Edge[m + 1];
long ans = Long.MAX_VALUE;
fa = new int[n + 1];
st = new int[n + 1];
for (int i = 1; i <= m; i++) {
int u = scanner.nextInt();
int v = scanner.nextInt();
int g = scanner.nextInt();
int s = scanner.nextInt();
a[i] = new Edge(u, v, g, s);
}
Arrays.sort(a, 1, m + 1);
top = 0;
for (int i = 1; i <= m; i++) {
Arrays.fill(fa, 0);
for (int j = top; j >= 1; j--) {
if (a[st[j]].s > a[i].s) {
st[j + 1] = st[j];
} else {
break;
}
}
top++;
st[top] = i;
int num = 0;
for (int j = 1; j <= top; j++) {
int fu = find(a[st[j]].u);
int fv = find(a[st[j]].v);
if (fu != fv) {
fa[fu] = fv;
st[++num] = st[j];
}
}
if (num == n - 1) {
ans = Math.min(ans, wg * a[i].g + wS * a[st[num]].s);
}
top = num;
}
if (ans == Long.MAX_VALUE) {
System.out.println(-1);
} else {
System.out.println(ans);
}
}
static int find(int x) {
if (fa[x] == 0) {
return x;
}
return fa[x] = find(fa[x]);
}
}
原文地址: https://www.cveoy.top/t/topic/qmCC 著作权归作者所有。请勿转载和采集!