hihocoder 1160 攻城略地
来源:互联网 发布:网络教育属于全日制吗 编辑:程序博客网 时间:2024/05/01 11:40
先并查集处理出每个集合,和每个集合最小的点的下标
然后把每个点权值从大到排序,砍k条边其实相当于加m - k条边,每次加一条边可以减少一个点的权值(除了每个集合的最小点),这样从大到小把能删的尽量贪心删掉即可
代码:
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;typedef long long ll;const int N = 1000005;const int INF = 0x3f3f3f3f;int t, n, m, k, w[N], parent[N], Min[N], id[N];int find(int x) { if (x == parent[x]) return x; return parent[x] = find(parent[x]);}bool cmp(int a, int b) { return w[a] < w[b];}int main() { int cas = 0; scanf("%d", &t); while (t--) { ll ans = 0; scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= n; i++) { Min[i] = INF; parent[i] = i; Min[i] = i; scanf("%d", &w[i]); id[i] = i; ans += w[i]; } int u, v; for (int i = 0; i < m; i++) { scanf("%d%d", &u, &v); int pu = find(u); int pv = find(v); if (pu != pv) { if (w[Min[pu]] < w[Min[pv]]) Min[pv] = Min[pu]; parent[pu] = pv; } } k = m - k; sort(id + 1, id + n + 1, cmp); for (int i = n; i >= 1; i--) if (k && Min[find(id[i])] != id[i]) ans -= w[id[i]], k--; printf("Case #%d: %lld\n", ++cas, ans); } return 0;}
0 0
- hihoCoder 1160 攻城略地
- hihocoder 1160 攻城略地
- 【并查集】 hihocoder #1160 : 攻城略地
- hihoCoder 1160 攻城略地 编程之美2015初赛第二场
- 待攻城略地的任务
- 攻城略地-突进包围分析
- hihocoder:
- hihoCoder
- Hihocoder
- hihocoder
- hihocoder
- hihocoder
- hihocoder
- hihocoder
- HihoCoder
- HihoCoder
- HihoCoder
- HihoCoder
- Android - View绘图原理总结
- 作业四
- 基于redis和R语言构建并行计算平台(yiyou)
- 百度地图在AndroidStudio中的配置
- Spreadsheets
- hihocoder 1160 攻城略地
- 【C++】输入并反向输出字符串
- 2. oracle学习入门系列之二 数据库基础知识
- 记录心情
- hihocoder 1169 猜数字
- java内存分配策略
- 迭代与递归的区别
- word 查找
- 树莓派2使用360wifi ,小米wifi