Submission #1141608

#TimeUsernameProblemLanguageResultExecution timeMemory
1141608SulA시간이 돈 (balkan11_timeismoney)C++20
40 / 100
2 ms584 KiB
#include <bits/stdc++.h>
#define all(a) a.begin(), a.end()
using namespace std;

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++]);
    if (m == n-1) {
        cout << accumulate(T, T + m, 0) << " " << accumulate(C, C + m, 0) << '\n';
        for (int i = 0; i < m; i++) cout<<U[i]<<' '<<V[i]<<'\n';
    } else {
        DSU dsu(n);
        int edges[m], ans = 0;
        vector<pair<int,int>> tree;
        iota(edges, edges + m, 0);
        sort(edges, edges + m, [&](int i, int j) { return T[i] < T[j]; });
        for (int i : edges) {
            if (dsu.merge(U[i], V[i])) {
                ans += T[i];
                tree.emplace_back(U[i], V[i]);
            }
        }
        cout<<ans << " " << ans << '\n';
        for (auto [u, v] : tree) cout<<u<<" "<<v<<"\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...