제출 #1141760

#제출 시각아이디문제언어결과실행 시간메모리
1141760SulAtimeismoney (balkan11_timeismoney)C++20
60 / 100
16 ms584 KiB
#include <bits/stdc++.h> #define all(a) a.begin(), a.end() using namespace std; const int timeCoef = 5, costCoef = 4; struct DSU { vector<int> par; DSU(int n) : par(n) { iota(all(par), 0); } int find(int u) { return par[u] == u ? u : par[u] = find(par[u]); } bool merge(int u, int v) { u = find(u), v = find(v); if (u != v) par[v] = u; return u != v; } }; signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n,m; cin>>n>>m; int U[m], V[m], T[m], C[m]; for (int i = 0; i < m; cin>>U[i]>>V[i]>>T[i]>>C[i++]); DSU dsu(n); int edges[m]; long long sum1 = 0, sum2 = 0; vector<pair<int,int>> tree; iota(edges, edges + m, 0); sort(edges, edges + m, [&](int i, int j) { return timeCoef*T[i] + costCoef*C[i] < timeCoef*T[j] + costCoef*C[j]; }); for (int iter = n-1; iter --> 0; ) { long long mn_val = 1e18; int mn_ind = -1; for (int i = 0; i < m; i++) { if (dsu.find(U[i]) == dsu.find(V[i])) continue; if ((sum1 + T[i])*(sum2 + C[i]) < mn_val) { mn_val = (sum1 + T[i])*(sum2 + C[i]); mn_ind = i; } } sum1 += T[mn_ind]; sum2 += C[mn_ind]; dsu.merge(U[mn_ind], V[mn_ind]); tree.emplace_back(U[mn_ind], V[mn_ind]); } cout<< sum1 << " " << sum2 << '\n'; for (auto [u, v] : tree) cout<<u<<" "<<v<<"\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...