1 条题解

  • 0
    @ 2025-4-5 11:35:49
    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 300;
    int n;
    int W[MAXN + 5];
    
    struct Edge
    {
        int u, v, w;
    };
    vector<Edge> e;
    bool cmp(Edge x, Edge y)
    {
        return x.w < y.w;
    }
    
    int fa[MAXN + 5];
    int findFa(int x)
    {
        if (x == fa[x])
            return x;
        return fa[x] = findFa(fa[x]);
    }
    
    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> W[i];
        for (int u = 1; u <= n; u++)
            for (int v = 1; v <= n; v++)
            {
                int w;
                cin >> w;
                if (u < v)
                    e.push_back({u, v, w});
            }
    
        // 所谓的井,可以看作是有一个超级井到每个点有一条长度为 W[i] 的边
        for (int i = 1; i <= n; i++)
            e.push_back({n + 1, i, W[i]});
        n++;
        for (int i = 1; i <= n; i++)
            fa[i] = i;
    
        int ans = 0;
        sort(e.begin(), e.end(), cmp);
        for (int i = 0; i <= (int)e.size() - 1; i++)
        {
            int u = e[i].u, v = e[i].v, w = e[i].w;
            int faU = findFa(u);
            int faV = findFa(v);
            if (faU == faV)
                continue;
            fa[faU] = faV;
            ans += w;
        }
        cout << ans;
        return 0;
    }
    
    • 1

    信息

    ID
    2345
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    23
    已通过
    13
    上传者