3RE+1WA求助
  • 板块P1194 买礼物
  • 楼主RZXBXie
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/12/2 16:54
  • 上次更新2023/10/27 00:44:09
查看原帖
3RE+1WA求助
747213
RZXBXie楼主2022/12/2 16:54
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1010;
int g[N][N], p[N];
int n, m;
struct Edge{
    int a, b, w;
    bool operator< (const Edge& W) const{
        return w < W.w;
    }
}edges[100 * N];

int find(int x) {
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= m; ++i) p[i] = i;
    for (int i = 1; i <= m; ++i) {
        for (int j = 1; j <= m; ++j) {
            cin >> g[i][j];
        }
    }
    int k = 0;
    for (int i = 1; i <= m; ++i) {
        for (int j = i; j <= m; ++j) {
            if (g[i][j] != 0) {
                edges[++k] = {i, j, g[i][j]};
            }
        }
    }
    sort(edges + 1, edges + k + 1);
    int res = 0, cnt = 0;
    for (int i = 1; i <= k; ++i) {
        int a = edges[i].a, b = edges[i].b, w = edges[i].w;
        int pa = find(a), pb = find(b);
        if (pa != pb) {
            p[pa] = pb;
            cnt++;
            res += w;
        }
    }
    cout << res + n * (m - cnt) << endl;
    return 0;
}
2022/12/2 16:54
加载中...