import java.util.Arrays; import java.util.Scanner;

public class Main { static class Edge implements Comparable { int u; int v; int g; int s;

    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]);
}

}

C++ 代码到 Java 代码的转换:最小生成树问题

原文地址: https://www.cveoy.top/t/topic/qmCC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录