Submission

Status:

[PPPPPPPPPP]

Subtask/Task Score:

{100/100}

Score: 100

User: tull

Problemset: รัฐบาล

Language: cpp

Time: 0.004 second

Submitted On: 2026-06-01 00:29:21

#pragma GCC optimize("O3,unroll-loops")
#include <bits/stdc++.h>
using namespace std;

#define int long long
const long long INF = 4e18;

struct DSU {
    vector<int> par, sz;

    DSU(int n) : par(n + 1), sz(n + 1, 1) {
        iota(par.begin(), par.end(), 0);
    }

    int Find(int a) {
        if (par[a] == a) return a;
        return par[a] = Find(par[a]);
    }

    bool Same(int a, int b) {
        return Find(a) == Find(b);
    }

    void Union(int a, int b) {
        a = Find(a);
        b = Find(b);

        if (a == b) return;

        if (sz[b] > sz[a]) swap(a, b);

        par[b] = a;
        sz[a] += sz[b];
    }
};

struct Edge {
    int w, u, v, id;
};

pair<int, vector<int>> MST(vector<Edge>& edges, int n, int banId, bool record) {
    DSU dsu(n);

    int sum = 0;
    int cnt = 0;
    vector<int> usedEdges;

    for (auto& e : edges) {
        if (e.id == banId) continue;

        if (!dsu.Same(e.u, e.v)) {
            dsu.Union(e.u, e.v);
            sum += e.w;
            cnt++;

            if (record) {
                usedEdges.push_back(e.id);
            }
        }
    }

    if (cnt != n - 1) {
        return {INF, {}};
    }

    return {sum, usedEdges};
}

signed main() {
    cin.tie(nullptr)->sync_with_stdio(false);

    int n, m;
    cin >> n >> m;

    vector<Edge> edges(m);

    for (int i = 0; i < m; i++) {
        int l, r, x;
        cin >> l >> r >> x;

        if (l > r) swap(l, r);

        edges[i] = {x, l, r, i};
    }

    sort(edges.begin(), edges.end(), [](const Edge& a, const Edge& b) {
        if (a.w != b.w) return a.w < b.w;
        return a.id < b.id;
    });

    auto [mstWeight, mstEdges] = MST(edges, n, -1, true);

    cout << mstWeight << ' ';

    int secondMST = INF;

    for (int id : mstEdges) {
        auto [weight, unused] = MST(edges, n, id, false);
        secondMST = min(secondMST, weight);
    }

    if (secondMST == INF) {
        cout << -1;
    } else {
        cout << secondMST;
    }
}