克鲁斯WA了三个点 有特判 数组没开小 求大佬康康
查看原帖
克鲁斯WA了三个点 有特判 数组没开小 求大佬康康
469476
sasuke2000楼主2021/5/16 12:15
#include <algorithm>
#include <iostream>
#include <string.h>
using namespace std;

const int N = 505;
int dad[N];
int ans = 0;
int val[N][N];
int a, b; //价格  物品数量

struct bri
{
    int a;
    int b;
    int v;

    bool operator<(bri b1) const
    {
        return v < b1.v;
    }
} br[N];

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

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

int main()
{
    int s = 0;
    cin >> a >> b;

    for (int i = 1; i < b + 1; i++)
        for (int j = 1; j < b + 1; j++)
            cin >> val[i][j];

    for (int i = 1; i < b + 1; i++)
        for (int j = i + 1; j < b + 1; j++)
        {
            br[++s].a = i;
            br[s].b = j;
            if (!val[i][j] || val[i][j] > a)
                br[s].v = a;
            else
                br[s].v = val[i][j];
        }

    init();

    sort(br + 1, br + 1 + s);
    // for (int i = 1; i < s + 1; i++)
    //     cout << br[i].a << ' ' << br[i].b << ' ' << br[i].v << endl;
    for (int i = 1; i < s + 1; i++)
    {
        int aa = find(br[i].a), bb = find(br[i].b);

        if (aa != bb)
        {
            dad[aa] = bb;
            b--;
            ans += br[i].v;
        }

        if (b == 1)
        {
            cout << ans + a;
            return 0;
        }
    }

    cout << ans + a;
}
2021/5/16 12:15
加载中...