买还是建

紫书P358

【题目链接】买还是建

【题目类型】最小生成树

&题解:

这题真的心累,看了3天,最后照着码还是wa,先放lrj代码,以后再看吧

&代码:

  1. // UVa1151 Buy or Build
  2. // Rujia Liu
  3. #include <cstdio>
  4. #include <cmath>
  5. #include <cstring>
  6. #include <vector>
  7. #include <algorithm>
  8. using namespace std;
  9. const int maxn = 1000 + 10;
  10. const int maxq = 8;
  11. int n;
  12. int x[maxn], y[maxn], cost[maxq];
  13. vector<int> subn[maxq];
  14. int pa[maxn];
  15. int findset(int x) { return pa[x] != x ? pa[x] = findset(pa[x]) : x; }
  16. struct Edge {
  17. int u, v, d;
  18. Edge(int u, int v, int d):u(u),v(v),d(d) {}
  19. bool operator < (const Edge& rhs) const {
  20. return d < rhs.d;
  21. }
  22. };
  23. // initialize pa and sort e before calling this method
  24. // cnt is the current number of components
  25. int MST(int cnt, const vector<Edge>& e, vector<Edge>& used) {
  26. if(cnt == 1) return 0;
  27. int m = e.size();
  28. int ans = 0;
  29. used.clear();
  30. for(int i = 0; i < m; i++) {
  31. int u = findset(e[i].u), v = findset(e[i].v);
  32. int d = e[i].d;
  33. if(u != v) {
  34. pa[u] = v;
  35. ans += d;
  36. used.push_back(e[i]);
  37. if(--cnt == 1) break;
  38. }
  39. }
  40. return ans;
  41. }
  42. int main() {
  43. int T, q;
  44. scanf("%d", &T);
  45. while(T--) {
  46. scanf("%d%d", &n, &q);
  47. for(int i = 0; i < q; i++) {
  48. int cnt;
  49. scanf("%d%d", &cnt, &cost[i]);
  50. subn[i].clear();
  51. while(cnt--) {
  52. int u;
  53. scanf("%d", &u);
  54. subn[i].push_back(u-1);
  55. }
  56. }
  57. for(int i = 0; i < n; i++) scanf("%d%d", &x[i], &y[i]);
  58. vector<Edge> e, need;
  59. for(int i = 0; i < n; i++)
  60. for(int j = i+1; j < n; j++) {
  61. int c = (x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]);
  62. e.push_back(Edge(i, j, c));
  63. }
  64. for(int i = 0; i < n; i++) pa[i] = i;
  65. sort(e.begin(), e.end());
  66. int ans = MST(n, e, need);
  67. for(int mask = 0; mask < (1<<q); mask++) {
  68. // union cities in the same sub-network
  69. for(int i = 0; i < n; i++) pa[i] = i;
  70. int cnt = n, c = 0;
  71. for(int i = 0; i < q; i++) if(mask & (1<<i)) {
  72. c += cost[i];
  73. for(int j = 1; j < subn[i].size(); j++) {
  74. int u = findset(subn[i][j]), v = findset(subn[i][0]);
  75. if(u != v) { pa[u] = v; cnt--; }
  76. }
  77. }
  78. vector<Edge> dummy;
  79. ans = min(ans, c + MST(cnt, need, dummy));
  80. }
  81. printf("%d\n", ans);
  82. if(T) printf("\n");
  83. }
  84. return 0;
  85. }

UVA 1151 买还是建(最小生成树)的更多相关文章

  1. UVa 1151 买还是建

    https://vjudge.net/problem/UVA-1151 题意: 平面上有n个点,你的任务是让所有n个点连通.为此,你可以新建一些边,费用等于两个端点的距离平方和.另外还有q个套餐可以购 ...

  2. UVA 1151二进制枚举子集 + 最小生成树

    题意:平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此, 你可以新建一些边,费用等于两个端点的欧几里得距离的平方.另外还有q(0<=q<=8)个套餐(数 ...

  3. UVA 1151 Buy or Build (MST最小生成树,kruscal,变形)

    题意: 要使n个点之间能够互通,要使两点直接互通需要耗费它们之间的欧几里得距离的平方大小的花费,这说明每两个点都可以使其互通.接着有q个套餐可以选,一旦选了这些套餐,他们所包含的点自动就连起来了,所需 ...

  4. UVA - 1151 Buy or Build (买还是建)(并查集+二进制枚举子集)

    题意:平面上有n个点(1<=n<=1000),你的任务是让所有n个点连通.可以新建边,费用等于两端点欧几里德距离的平方.也可以购买套餐(套餐中的点全部连通).问最小费用. 分析: 1.先将 ...

  5. UVa 1151 - Buy or Build(最小生成树)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  6. uva 1151(最小生成树,枚举子集)

    题意:平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此,你可以新建一些边,费用等于两个端点的欧几里得距离的平方.另外还有q(0<=q<=8)个套餐,可以 ...

  7. UVa 1151 Buy or Build (最小生成树+二进制法暴力求解)

    题意:给定n个点,你的任务是让它们都连通.你可以新建一些边,费用等于两点距离的平方(当然越小越好),另外还有几种“套餐”,可以购买,你购买的话,那么有些边就可以连接起来, 每个“套餐”,也是要花费的, ...

  8. UVA 1151 Buy or Build (最小生成树)

    先求出原图的最小生成树,然后枚举买哪些套餐,把一个套餐内的点相互之间边权为0,直接用并查集缩点.正确性是基于一个贪心, 在做Kruskal算法是,对于没有进入最小生成树的边,排序在它前面的边不会减少. ...

  9. 【UVA 1151】 Buy or Build (有某些特别的东东的最小生成树)

    [题意] 平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此,你可以新建一些边,费用等于两个端点的欧几里得距离的平方. 另外还有q(0<=q<=8)个套餐 ...

随机推荐

  1. Java 查漏补缺

    摘自<老马说编程> 计算机程序的思维逻辑 (4) - 整数的二进制表示与位运算 Java中不支持直接写二进制常量,比如,想写二进制形式的11001,Java中不能直接写,可以在前面补0,补 ...

  2. 自学C++第一天

    常引用: 可以用在复制构造函数里面.

  3. js完美身份证验证

    /*根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数 ...

  4. Resharp注册码

    admin@youbaozang.comSpFEMUSrPM0AGupqlNs6J1Ey7HrjpJZy admin@wuleba.comd6GuozPm+bsCmPOtyJ2w1ggRnCr3Vk5 ...

  5. php生成唯一订单号

    支持更改长度/** * 生成唯一订单号 * */ function build_order_no(){ return date('Ymd').substr(implode(NULL, array_ma ...

  6. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  7. Matlab从一系列图片导出AVI视频,导出GIF动图

    平台:Win7,Matlab 2014a 从一系列图片导出AVI视频的M代码如下: clear all; % 清除变量 % 官方示例,命令窗口输入“doc VideoWriter” writerObj ...

  8. Neo4j 查询已经创建的索引与约束

    在Neo4j 2.0之后为cypher语法增加了一些类似于DDL的语法,能够自己创建索引,约束等等. 有如下的方法可以查询到当前图数据库的索引数量: neo4j-shell 使用:index –ind ...

  9. 信号量 semaphore 和 @synchronized 的运用

    1. //创建全局队列 dispatch_queue_t queue = dispatch_get_global_queue(0, 0); //创建信号量 dispatch_semaphore_t s ...

  10. 自己瞎捣腾的Win7下Linux安装之路-----理论篇

    接着上回说道,我把双系统做好啦,开心.... 之后我就在想几个问题: 1.在Ubuntu装好后,重启电脑却还是win7,等我用EasyBCD之后,才可选择使用装好的Ubuntu呢? 2.在用EasyB ...