标题指的边集是说这道题的套餐, 是由几条边构成的。

思路是先做一遍最小生成树排除边, 因为如果第一次做没有加入的边, 到后来新加入了很多权值为0的边,这些边肯定排在最前面,然后这条边的前面的那些边肯定都要再扫一遍, 也就是这条边无论如何都不会选。

那么后来就是二进制枚举套餐, 从头开始, 加入套餐中的边然后权值加上套餐的权值, 然后把之前筛选下来的边做kruskal就ok了。

注意要对数据范围敏感, 这里套餐最多也就8个所以可以二进制枚举子集。

#include<cstdio>
#include<vector>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; const int MAXN = 1123;
int x[MAXN], y[MAXN], f[MAXN];
int cost[MAXN], n, m, q, cnt, sum;
struct node
{
int u, v, w;
node(int u = 0, int v = 0, int w = 0) : u(u), v(v), w(w) {}
bool operator < (const node& rhs) const
{
return w < rhs.w;
}
};
vector<node> Edge, need;
vector<int> k[9]; int find(int x)
{
if(f[x] != x)
f[x] = find(f[x]);
return f[x];
} int solve()
{
int ret = 0;
REP(i, 0, need.size())
{
int u = find(need[i].u), v = find(need[i].v);
if(u != v)
{
f[u] = v;
ret += need[i].w;
if(--cnt == 1) break;
}
}
return ret;
} int main()
{
int T;
scanf("%d", &T); while(T--)
{
Edge.clear(); need.clear();
scanf("%d%d", &n, &q);
REP(i, 0, q)
{
int t, x; k[i].clear();
scanf("%d%d", &t, &cost[i]);
while(t--)
{
scanf("%d", &x);
k[i].push_back(x);
}
} REP(i, 1, n + 1) scanf("%d%d", &x[i], &y[i]), f[i] = i;
REP(i, 1, n + 1)
REP(j, i + 1, n + 1)
{
int t = (x[i]-x[j]) * (x[i]-x[j]) + (y[i]-y[j]) * (y[i]-y[j]);
Edge.push_back(node(i, j, t));
}
sort(Edge.begin(), Edge.end()); int ans = 0; cnt = n;
REP(i, 0, Edge.size())
{
int u = find(Edge[i].u), v = find(Edge[i].v);
if(u != v)
{
need.push_back(Edge[i]);
f[u] = v;
ans += Edge[i].w;
if(--cnt == 1) break; //注意是1
}
} REP(num, 0, 1 << q)
{
sum = 0; cnt = n;
REP(i, 1, n + 1) f[i] = i;
REP(i, 0, q)
if(num & (1 << i))
{
sum += cost[i];
REP(j, 0, k[i].size())
{
int u = find(k[i][j]), v = find(k[i][0]);
if(u != v) f[u] = v, cnt--;
}
} sum += solve();
ans = min(ans, sum);
} printf("%d\n", ans);
if(T) puts("");
} return 0;
}

紫书 例题 11-3 UVa 1151 (有边集的最小生成树+二进制枚举子集)的更多相关文章

  1. 紫书 例题 11-13 UVa 10735(混合图的欧拉回路)(最大流)

    这道题写了两个多小时-- 首先讲一下怎么建模 我们的目的是让所有点的出度等于入度 那么我们可以把点分为两部分, 一部分出度大于入度, 一部分入度大于出度 那么显然, 按照书里的思路,将边方向后,就相当 ...

  2. 紫书 例题8-3 UVa 1152(中途相遇法)

    这道题要逆向思维, 就是求出答案的一部分, 然后反过去去寻找答案存不存在. 其实很多其他题都用了这道题目的方法, 自己以前都没有发现, 这道题专门考这个方法.这个方法可以没有一直往下求, 可以省去很多 ...

  3. 紫书 例题8-12 UVa 12627 (找规律 + 递归)

    紫书上有很明显的笔误, 公式写错了.g(k, i)的那个公式应该加上c(k-1)而不是c(k).如果加上c(k-1)那就是这一次 所有的红气球的数目, 肯定大于最下面i行的红气球数 我用的是f的公式, ...

  4. 紫书 例题8-4 UVa 11134(问题分解 + 贪心)

     这道题目可以把问题分解, 因为x坐标和y坐标的答案之间没有联系, 所以可以单独求两个坐标的答案 我一开始想的是按照左区间从小到大, 相同的时候从右区间从小到大排序, 然后WA 去uDebug找了数据 ...

  5. 紫书 例题8-17 UVa 1609 (构造法)(详细注释)

    这道题用构造法, 就是自己依据题目想出一种可以得到解的方法, 没有什么规律可言, 只能根据题目本身来思考. 这道题的构造法比较复杂, 不知道刘汝佳是怎么想出来的, 我想的话肯定想不到. 具体思路紫书上 ...

  6. 紫书 例题 9-5 UVa 12563 ( 01背包变形)

    总的来说就是价值为1,时间因物品而变,同时注意要刚好取到的01背包 (1)时间方面.按照题意,每首歌的时间最多为t + w - 1,这里要注意. 同时记得最后要加入时间为678的一首歌曲 (2)这里因 ...

  7. 【uva 1151】Buy or Build(图论--最小生成树+二进制枚举状态)

    题意:平面上有N个点(1≤N≤1000),若要新建边,费用是2点的欧几里德距离的平方.另外还有Q个套餐,每个套餐里的点互相联通,总费用为Ci.问让所有N个点连通的最小费用.(2组数据的输出之间要求有换 ...

  8. UVA 1151 买还是建(最小生成树)

    买还是建 紫书P358 [题目链接]买还是建 [题目类型]最小生成树 &题解: 这题真的心累,看了3天,最后照着码还是wa,先放lrj代码,以后再看吧 &代码: // UVa1151 ...

  9. 紫书 例题 10-26 UVa 11440(欧拉函数+数论)

    这里用到了一些数论知识 首先素因子都大于M等价与M! 互质 然后又因为当k与M!互质且k>M!时当且仅当k mod M! 与M!互质(欧几里得算法的原理) 又因为N>=M, 所以N!为M! ...

随机推荐

  1. (2)RDD的基本操作

    一.map操作,map(Transform) 二.collect操作,collect(Action) 三.使用PairRDD来做计算,类似key-value结构 采用groupByKey来.将资料按照 ...

  2. 树莓派搭建 Google TV

    出处:http://my.oschina.net/funnky/blog/142067 树莓派搭建 Google TV 目录:[ - ] Google TV是啥玩意 ? 搭建我们自己的Google T ...

  3. 【【henuacm2016级暑期训练】动态规划专题 D】Writing Code

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 二维费用背包. f[i][j][k] 前i个人,写了j行,bug不超过k的方案数. 可以把每个人看成是一个物品. 它可以无限拿.然后 ...

  4. springboot启动嵌入式tomcat报错找不到jar包,关键字:FileNotFoundException,derbyLocale_cs.jar,StandardJarScanner.scan

    异常: java.io.FileNotFoundException: /Users/lanhuajian/.m2/repository/org/apache/derby/derby/10.13.1.1 ...

  5. gdb学习-checkpoint,watch

    checkpoint的内容参考: http://blog.chinaunix.net/uid-23629988-id-2943273.html 这一篇主要是checkpoint,在next之前加che ...

  6. [Angular] Read Custom HTTP Headers Sent by the Server in Angular

    By default the response body doesn’t contain all the data that might be needed in your app. Your ser ...

  7. 【Android】Android程序自己主动更新

    App自己主动更新的步骤可分为三步: 检查更新(假设有更新进行第2步,否则返回) 下载新版的APK安装包 安装APK 以下对这三步进行解释.当中会穿插相应代码.App自己主动更新的这三步所有被封装到了 ...

  8. 走进windows编程的世界-----入门篇

    1   Windows编程基础 1.1Win32应用程序基本类型 1)  控制台程序 不须要完好的windows窗体,能够使用DOS窗体方式显示 2)  Win32窗体程序 包括窗体的程序,能够通过窗 ...

  9. 根据数据表自动生成javaBean

    package fanshe; import java.io.File; import java.io.FileWriter; import java.io.IOException; import j ...

  10. Eclipse 更新Android SDK后,新建项目出现appcompat_v7project的相关问题

    Eclipse 更新Android SDK后,新建项目出现各种问题.网上各种解决方式,搞了好久,总结一下. 1.出现error: Error retrieving parent for item: N ...