比赛 2025暑期集训第8场 评测结果 AAAAATTTTT
题目名称 次小生成树 最终得分 50
用户昵称 xpb 运行时间 10.171 s
代码语言 C++ 内存使用 4.75 MiB
提交时间 2025-08-13 09:11:56
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
struct E {
    int a, b, c;
    bool u;
    bool operator<(const E& o) const {
        return c < o.c;
    }
};
vector<int> p;
int f(int x) {
    if (p[x] != x) p[x] = f(p[x]);
    return p[x];
}
int main() {
    freopen("secmst.in", "r", stdin);
    freopen("secmst.out", "w", stdout);

    int N, M;
    cin >> N >> M;
    vector<E> e(M);
    for (int i = 0; i < M; ++i) {
        cin >> e[i].a >> e[i].b >> e[i].c;
        e[i].u = false;
    }
    sort(e.begin(), e.end());
    p.resize(N + 1);
    for (int i = 1; i <= N; ++i) {
        p[i] = i;
    }
    long long m = 0;
    vector<E> t;
    for (int i = 0; i < M; ++i) {
        int u = f(e[i].a);
        int v = f(e[i].b);
        if (u != v) {
            p[v] = u;
            m += e[i].c;
            e[i].u = true;
            t.push_back(e[i]);
        }
    }
    long long s = LONG_LONG_MAX;
    for (int i = 0; i < t.size(); ++i) {
        p.assign(N + 1, 0);
        for (int j = 1; j <= N; ++j) {
            p[j] = j;
        }
        long long cur = 0;
        int cnt = 0;
        for (int j = 0; j < M; ++j) {
            if (e[j].a == t[i].a && e[j].b == t[i].b && e[j].c == t[i].c) {
                continue;
            }
            int u = f(e[j].a);
            int v = f(e[j].b);
            if (u != v) {
                p[v] = u;
                cur += e[j].c;
                cnt++;
            }
        }
        if (cnt == N - 1 && cur > m) {
            if (cur < s) s = cur;
        }
    }
    cout << s << endl;
    return 0;
}