1 条题解

  • -10
    @ 2023-10-22 9:26:12

    #include <bits/stdc++.h> using namespace std; #define int long long int n, fa[2020], m, s[2020], cnt, ans; struct node { int x, y, v; //分别储存两个节点与边权 } a[2020000]; bool cmp(node a, node b) { return a.v > b.v; //因为是最大生成树,所以以边权为关键字,从小到大排序 } int find_root(int x) //找根 { if (fa[x] == x) return x; return find_root(fa[x]); } signed main() { cin >> n; for (int i = 1; i <= n; i++) //输入 cin >> s[i]; for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { a[++m].v = s[i] ^ s[j]; //储存i与j之间的边的边权 a[m].x = i; //储存一个节点 a[m].y = j; //储存另一个节点 } } for (int i = 1; i <= 2010; i++) //初始化 fa[i] = i; sort(a + 1, a + 1 + m, cmp); //排序,为贪心做准备 for (int i = 1; i <= m; i++) { int x = find_root(a[i].x), y = find_root(a[i].y); //找根 if (x != y) { //是不是已经连接 fa[x] = y; //连接 cnt++; //取了cnt个边 ans += a[i].v; //边权和为ans } if (cnt == n - 1) //如果已经取完了 break; //退出 } cout << ans; //输出答案 return 0; }

    • 1

    信息

    ID
    1884
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    59
    已通过
    31
    上传者