1 条题解

  • 0
    @ 2025-4-12 10:55:44
    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 400;
    const int MAXM = 10000;
    int n, m, f;
    // 并查集
    int fa[MAXN + 5];
    int findFa(int x)
    {
        if (x == fa[x])
            return x;
        return fa[x] = findFa(fa[x]);
    }
    // 存边
    struct Edge
    {
        int u, v, c, t;
        double w;
    };
    Edge e[MAXM + 5];
    bool cmp(Edge a, Edge b)
    {
        return a.w < b.w;
    }
    // 二分答案
    bool check(double mid)
    {
        // (f-sum{ci}) / sum{ti} >= mid
        // (f-sum{ci}) >= mid * sum{ti}
        // (f-sum{ci}) - sum{mid * ti} >= 0
        // f - sum{ci+mid*ti} >= 0
        // 先求 min(sum{ci+mid*ti})
        for (int i = 1; i <= m; i++)
            e[i].w = e[i].c + mid * e[i].t;
        sort(e + 1, e + m + 1, cmp);
        for (int i = 1; i <= n; i++)
            fa[i] = i;
        double sum = 0;
        for (int i = 1; i <= m; i++)
        {
            int u = e[i].u;
            int v = e[i].v;
            double w = e[i].w;
            int faU = findFa(u);
            int faV = findFa(v);
            if (faU == faV)
                continue;
            sum += e[i].w;
            fa[faU] = faV;
        }
        return f - sum >= 0;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n >> m >> f;
        for (int i = 1; i <= m; i++)
            cin >> e[i].u >> e[i].v >> e[i].c >> e[i].t;
        double l = 0;
        double r = f;
        while (r - l > 1e-6)
        {
            double mid = (l + r) / 2;
            if (check(mid))
                l = mid;
            else
                r = mid;
        }
        cout << fixed << setprecision(4) << l;
        return 0;
    }
    

    信息

    ID
    5740
    时间
    1000ms
    内存
    125MiB
    难度
    5
    标签
    递交数
    16
    已通过
    10
    上传者