Submission #43276

#TimeUsernameProblemLanguageResultExecution timeMemory
43276aometimeismoney (balkan11_timeismoney)C++14
100 / 100
611 ms944 KiB
#include <bits/stdc++.h> using namespace std; const int N = 205; struct Edge { int u, v, c, t; Edge (int u, int v, int c, int t) : u(u), v(v), c(c), t(t) {} }; typedef pair<int, int> ii; int n, m; int par[N]; vector<Edge> edges; ii res = ii(1e9, 1e9); vector<ii> vres, buf; int find(int u) { return u == par[u] ? u : par[u] = find(par[u]); } bool join(int u, int v) { u = find(u), v = find(v), par[u] = v; return u != v; } ii get(int c1, int c2) { sort(edges.begin(), edges.end(), [&] (Edge x, Edge y) { return 1LL * x.c * c1 + 1LL * x.t * c2 < 1LL * y.c * c1 + 1LL * y.t * c2; }); ii ret = ii(0, 0); buf.clear(); for (int i = 0; i < n; ++i) par[i] = i; for (auto i : edges) { if (join(i.u, i.v)) { ret.first += i.c, ret.second += i.t; buf.push_back(ii(i.u, i.v)); } } return ret; } bool ccw(ii x, ii y, ii z) { return 1LL * (y.first - x.first) * (z.second - x.second) - 1LL * (y.second - x.second) * (z.first - x.first) > 0; } void calc(ii x) { if (1LL * res.first * res.second > 1LL * x.first * x.second) { res = x, vres = buf; } } void solve(ii l, ii r) { ii mid = get(l.second - r.second, r.first - l.first); if (ccw(mid, r, l)) { calc(mid), solve(l, mid), solve(mid, r); } } int main() { ios::sync_with_stdio(false); cin >> n >> m; for (int i = 0; i < m; ++i) { int u, v, c, t; cin >> u >> v >> c >> t; edges.push_back(Edge(u, v, c, t)); } ii l = get(1, 0); calc(l); ii r = get(0, 1); calc(r); solve(l, r); cout << res.first << ' ' << res.second << '\n'; for (auto i : vres) cout << i.first << ' ' << i.second << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...