1 条题解
-
0
#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
- 上传者