悬关,WA on #13,代码很简洁
查看原帖
悬关,WA on #13,代码很简洁
534597
__PRO__楼主2024/1/18 17:17
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
constexpr int N = 100005, M = 300005;
int n, m, f[N][17], maxx[N][17], minn[N][17], dep[N];
bool vis[N];
struct edge {
    int u, v, w;
    bool operator<(const edge other) const
    {
        return w < other.w;
    }
} e[M];
struct edge2 {
    int v, w;
};
list<edge2> t[N];
int find(int x)
{
    return x != f[x][0] ? (f[x][0] = find(f[x][0])) : x;
}
ll kruskal()
{
    ll res = 0;
    sort(e + 1, e + 1 + m);
    for (int i = 1; i <= n; ++i)
        f[i][0] = i;
    for (int i = 1; i <= m; ++i) {
        auto [u, v, w] = e[i];
        int fu = find(u), fv = find(v);
        if (fu != fv) {
            res += w;
            vis[i] = true;
            f[fu][0] = fv;
            t[u].emplace_back(v, w);
            t[v].emplace_back(u, w);
        }
    }
    return res;
}
void dfs(int u, int fa)
{
    f[u][0] = fa;
    dep[u] = dep[fa] + 1;
    minn[u][0] = INT_MIN;
    for (int i = 1; 1 << i < dep[u]; ++i) {
        f[u][i] = f[f[u][i - 1]][i - 1];
        int tmp[] = { maxx[u][i - 1], maxx[f[u][i - 1]][i - 1], minn[u][i - 1], minn[f[u][i - 1]][i - 1] };
        sort(tmp, tmp + 4);
        maxx[u][i] = tmp[3];
        int len = unique(tmp, tmp + 4) - tmp;
        minn[u][i] = len > 1 ? tmp[len - 2] : INT_MIN;
    }
    for (auto [v, w] : t[u]) {
        if (v == fa)
            continue;
        maxx[v][0] = w;
        dfs(v, u);
    }
}
int lca(int u, int v)
{
    if (dep[u] < dep[v])
        swap(u, v);
    for (int i = 16; i >= 0; --i) {
        if (dep[f[u][i]] >= dep[v])
            u = f[u][i];
    }
    if (u == v)
        return u;
    for (int i = 16; i >= 0; --i) {
        if (f[u][i] != f[v][i]) {
            u = f[u][i];
            v = f[v][i];
        }
    }
    return f[u][0];
}
int query(int u, int fa, int x)
{
    int res = INT_MIN;
    for (int i = 16; i >= 0; --i) {
        if (dep[f[u][i]] >= dep[fa])
            res = max(res, maxx[u][i] != x ? maxx[u][i] : minn[u][i]);
    }
    return res;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> m;
    for (int i = 1; i <= m; ++i)
        cin >> e[i].u >> e[i].v >> e[i].w;
    ll s = kruskal();
    dfs(1, 0);
    ll ans = LLONG_MAX;
    for (int i = 1; i <= m; ++i) {
        if (!vis[i]) {
            auto [u, v, w] = e[i];
            int fa = lca(u, v);
            int cur = max(query(u, fa, w), query(v, fa, w));
            if (cur != INT_MIN)
                ans = min(ans, s - cur + w);
        }
    }
    cout << (ans != LLONG_MAX ? ans : -1);
    return 0;
}
2024/1/18 17:17
加载中...