1 条题解
-
-10
#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
- 上传者