uva 1151 Buy or Build (最小生成树)
来源:互联网 发布:html点击按钮执行js 编辑:程序博客网 时间:2024/05/19 15:42
uva 1151 Buy or Build
题目大意:给出n个点以及m种套餐,每种套餐的数据包括改套餐所包含点的数量,该套餐的费用,以及改套餐所包含的具体的点的编号。点与点之间的费用是他们的欧几里得距离的平方。现在问,在使用套餐的情况下连接所有点的最小费用。套餐可以叠加。
解题思路:先求出不用套餐构造最小生成树的最小费用。然后开始枚举用或不用改套餐构造最小生成树的费用(二进制枚举子集),维护该费用,最小值就是答案。
#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <cstdlib>using namespace std;typedef long long ll;const int N = 1005;const int M = N * N;int n, p;int X[N], Y[N];int fa[N];struct SubNet{ int num, cost; int rec[N];}sn[10];struct Edge{ int u, v; ll len;}edges[M];int en;int cmp(Edge a, Edge b) { return a.len < b.len;} ll getlen(int x, int y) { return pow(X[x] - X[y], 2) + pow(Y[x] - Y[y], 2);}int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }void init() { en = 0; for (int i = 0; i < N ;i++) fa[i] = i;} void input() { for (int i = 0; i < p; i++) { scanf("%d %d", &sn[i].num, &sn[i].cost); for (int j = 0; j < sn[i].num; j++) { scanf("%d", &sn[i].rec[j]); } } for (int i = 1; i <= n; i++) { scanf("%d %d", &X[i], &Y[i]); } for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { edges[en++] = (Edge){i, j, getlen(i, j)}; } } sort(edges, edges + en, cmp);}ll kruskal() { ll ans = 0; for (int i = 0; i < en; i++) { int x = find(edges[i].u), y = find(edges[i].v); if (x != y) { fa[x] = y; ans += edges[i].len; } } return ans;}void solve() { ll ans = kruskal(); for (int B = 0; B < (1 << p); B++) { ll temp = 0; for (int i = 0; i <= n; i++) fa[i] = i; for (int i = 0; i < p; i++) { if (B & (1 << i)) { temp += sn[i].cost; for (int j = 1; j < sn[i].num; j++) { fa[find(sn[i].rec[j - 1])] = find(sn[i].rec[j]); } } } temp += kruskal(); ans = min(ans, temp); } printf("%lld\n", ans);}int main() { int T; scanf("%d", &T); while (T--) { scanf("%d %d", &n, &p); init(); input(); solve(); if (T) puts(""); } return 0;}
0 0
- uva 1151 Buy or Build (最小生成树)
- UVA 1151 Buy or Build (最小生成树)
- uva 1151 - Buy or Build poj 2784 Buy or Build(最小生成树)
- UVa 1151 Buy or Build (最小生成树)
- UVa 1151 Buy or Build--最小生成树+二进制选择
- UVA 1151 - Buy or Build(最小生成树,二进制子集生成)
- UVA 1151 Buy or Build(最小生成树+枚举子集)
- 1151 - Buy or Build (最小生成树)
- UVA 1151 Buy or Build(生成树+二进制枚举)
- uva-1151-Buy or Build-二进制枚举子集,并查集,最小生成树,kruskal
- UVA 1151 && POJ 2784 - Buy or Build 最小生成树 二进制枚举
- UVA 1151 Buy or Build 最小生成树+二进制选取子集
- Uva1151.Buy or Build (最小生成树)
- uva 1151 Buy or Build
- UVA 1151 Buy or Build
- UVa 1151 Buy or Build
- UVA 1151 Buy or Build
- UVa 1151 Buy or Build
- 强制转化 (int)、(int&)和(int*)的区别
- GTK+浅谈之十五GObject面向对象的继承
- linux ping: unknown host 的解决方法
- 语音信号处理
- tomcat 连接池配置
- uva 1151 Buy or Build (最小生成树)
- Eclipse MAT 内存分析工具
- 怎么自己创建一个类似于smart的模版引擎
- 剑指offer 66题(上篇)
- 机器学习基石 作业2 实现1维和多维Decision Stump
- Target runtime Apache Tomcat v8.0 is not defined.错误解决方法
- iOS ARC MRC情况下重写setter getter方法
- Selenium里WebDriver中窗口的close()与quit()
- Java enum枚举 测试例子