克鲁斯WA3个点大佬HELP
查看原帖
克鲁斯WA3个点大佬HELP
469476
sasuke2000楼主2021/5/14 21:42
#include <algorithm>
#include <iostream>
#include <string.h>
using namespace std;

typedef long long int ll;
const int N = 100005;
int n, m;
int dad[N / 20];

struct edge
{
    int a;
    int b;
    int v;

    bool operator<(edge e) const
    {
        return v < e.v;
    }
} ed[N];

inline void init()
{
    for (int i = 1; i < n + 1; i++)
        dad[i] = i;
}

inline int find(int x)
{
    return x == dad[x] ? x : (dad[x] = find(dad[x]));
}

inline void merge(int x, int y)
{
    dad[find(x)] = find(y);
}

int main()
{
    ios::sync_with_stdio(false);
    int total = 0;
    ll ans = 0;
    cin >> n >> m;

    init();

    for (int i = 1; i < m + 1; i++)
        cin >> ed[i].a >> ed[i].b >> ed[i].v;

    sort(ed + 1, ed + 1 + m);

    for (int i = 1; i < m + 1; i++)
    {
        int aa = find(ed[i].a), bb = find(ed[i].b);
        if (aa != bb)
        {
            dad[aa] = bb;
            ans += ed[i].v;
            total++;
        }
        else
            continue;

        if (total == n - 1)
        {
            cout << ans;
            return 0;
        }
    }
}
2021/5/14 21:42
加载中...