93求调
查看原帖
93求调
1591113
prettycai666楼主2025/8/4 16:16
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const int M = 3e5 + 5;
const int LOG = 20;
struct E { int u, v, w; } e[M];
struct Node { int v, w; };
vector<Node> a[N];
int p[N], d[N], g[LOG][N], m[LOG][N], s[LOG][N];
bool t[M];
long long S;
int f(int x) 
{
    return p[x] == x ? x : p[x] = f(p[x]);
}
void bfs(int r) 
{
    queue<int> q;
    q.push(r);
    d[r] = 0;
    g[0][r] = -1;
    m[0][r] = s[0][r] = -1;
    while (!q.empty())
	{
        int u = q.front();
        q.pop();
        for (int i = 0; i < a[u].size(); i++) 
		{
            int v = a[u][i].v;
            int w = a[u][i].w;
            if (g[0][u] != v) 
			{
                d[v] = d[u] + 1;
                g[0][v] = u;
                m[0][v] = w;
                s[0][v] = -1;
                q.push(v);
            }
        }
    }
}
void init(int n) 
{
    for (int k = 1; k < LOG; k++) 
	{
        for (int i = 0; i < n; i++) 
		{
            if (g[k-1][i] == -1) 
			{
                g[k][i] = -1;
                m[k][i] = -1;
                s[k][i] = -1;
            } 
			else 
			{
                int p = g[k-1][i];
                g[k][i] = g[k-1][p];
                vector<int> c;
                if (m[k-1][i] != -1) c.push_back(m[k-1][i]);
                if (s[k-1][i] != -1) c.push_back(s[k-1][i]);
                if (m[k-1][p] != -1) c.push_back(m[k-1][p]);
                if (s[k-1][p] != -1) c.push_back(s[k-1][p]);
                sort(c.rbegin(), c.rend());
                c.erase(unique(c.begin(), c.end()), c.end());
                m[k][i] = c.empty() ? -1 : c[0];
                s[k][i] = c.size() < 2 ? -1 : c[1];
            }
        }
    }
}
void mg(int a1, int a2, int b1, int b2, int &mx, int &sc) 
{
    vector<int> c;
    if (a1 != -1) c.push_back(a1);
    if (a2 != -1) c.push_back(a2);
    if (b1 != -1) c.push_back(b1);
    if (b2 != -1) c.push_back(b2);
    sort(c.rbegin(), c.rend());
    c.erase(unique(c.begin(), c.end()), c.end());
    mx = c.empty() ? -1 : c[0];
    sc = c.size() < 2 ? -1 : c[1];
}
void q(int u, int v, int &mx, int &sc) 
{
    mx = -1;
    sc = -1;
    if (u == v) return;
    int a = -1, b = -1;
    if (d[u] < d[v]) swap(u, v);
    for (int k = LOG - 1; k >= 0; k--) 
	{
        if (d[u] - (1 << k) >= d[v]) 
		{
            int x, y;
            mg(a, b, m[k][u], s[k][u], x, y);
            a = x;
            b = y;
            u = g[k][u];
        }
    }
    if (u == v) 
	{
        mx = a;
        sc = b;
        return;
    }
    for (int k = LOG - 1; k >= 0; k--) 
	{
        if (g[k][u] != -1 && g[k][u] != g[k][v]) 
		{
            int x, y;
            mg(a, b, m[k][u], s[k][u], x, y);
            a = x;
            b = y;
            mg(a, b, m[k][v], s[k][v], x, y);
            a = x;
            b = y;
            u = g[k][u];
            v = g[k][v];
        }
    }
    int x, y;
    mg(a, b, m[0][u], s[0][u], x, y);
    a = x;
    b = y;
    mg(a, b, m[0][v], s[0][v], x, y);
    a = x;
    b = y;
    mx = a;
    sc = b;
}
int main() 
{
    int n, nt;
    scanf("%d%d", &n, &nt);
    for (int i = 0; i < nt; i++) 
	{
        scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);
        e[i].u--;
        e[i].v--;
    }
    sort(e, e + nt, [](E a, E b) { return a.w < b.w; });
    for (int i = 0; i < n; i++) 
	{
        p[i] = i;
    }
    for (int i = 0; i < nt; i++) 
	{
        int u = e[i].u;
        int v = e[i].v;
        int w = e[i].w;
        if (f(u) != f(v)) 
		{
            p[f(u)] = f(v);
            S += w;
            t[i] = 1;
            a[u].push_back({v, w});
            a[v].push_back({u, w});
        }
    }
    bfs(0);
    init(n);
    long long ans = 1e18;
    for (int i = 0; i < nt; i++) 
	{
        if (!t[i]) 
		{
            int u = e[i].u;
            int v = e[i].v;
            int w = e[i].w;
            int mx, sc;
            q(u, v, mx, sc);
            if (mx < w) 
			{
                ans = min(ans, S - mx + w);
            } 
			else if (sc != -1 && sc < w) 
			{
                ans = min(ans, S - sc + w);
            }
        }
    }
    printf("%lld\n", ans);
    return 0;
}
    
2025/8/4 16:16
加载中...