UVA 1151二进制枚举子集 + 最小生成树
题意:平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此, 你可以新建一些边,费用等于两个端点的欧几里得距离的平方。另外还有q(0<=q<=8)个套餐(数量小,可枚举),可以购买,如果你购买了第i个套餐,该套餐 中的所有结点将变得相互连通,第i个套餐的花费为ci。
分析:按照刘汝佳的思路做的。首先求一次本身的最小生成树值,然后枚举购买的套餐(二进制枚举),每次购买了之后,将其权值设为0,并且加进最小生成树。
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const int maxn=;
int x[maxn],y[maxn],p[maxn];
#define repu(i, a, b) for(int i = (a); i < (b); i++)
int bb[];
int tran(int h)
{
int i = ;
while(h)
{
bb[i] = h%;
i++;
h /= ;
}
return i;
}
int Find(int x)
{
return p[x]==x?x:p[x]=Find(p[x]);
}
struct edge
{
int u,v,w;
bool operator<(const edge&a)
const
{
return w<a.w;
}
} _e[maxn*maxn],e[maxn];
int q[][maxn],c[],t[];
int n,m,r,cnt;
void init()
{
m=cnt=;
}
ll kruscal()
{
ll ret=;
for(int i=; i<n; i++)///一共就只考虑n-1条边
{
int x=Find(e[i].u),y=Find(e[i].v);
if(x!=y)
{
ret += e[i].w;
p[x]=y;
}
}
return ret;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
init();
scanf("%d%d",&n,&r);
repu(i,,r)
{
scanf("%d%d",&t[i],&c[i]);
repu(j,,t[i]+)
scanf("%d",&q[i][j]);
}
repu(i,,n+)
scanf("%d%d",&x[i],&y[i]),p[i]=i;
repu(i,,n)
repu(j,i+,n+)
_e[++m]=(edge)
{
i,j,(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])
};
sort(_e+,_e+m+);
ll ans=;
repu(i,,m+)
{
int x = Find(_e[i].u),y = Find(_e[i].v);
if(x != y)
{
///自己没能想到的方案:
///存下最小生成树的边,而且每次求最小生成树的时候就直接用这些边求
e[++cnt]=_e[i];
ans+=_e[i].w;
p[x]=y;
}
}///本身的最小生成树
repu(b,,<<r)
{
int tt = tran(b);
ll ansx = ;
repu(i,,n+) p[i] = i;
repu(i,,tt)
{
if(bb[i])///如果是1就选该套餐
{
ansx += c[i];///枚举加哪个套餐,二进制枚举,最多就是2^8个
repu(j,,t[i]+)
{
int xx = Find(q[i][j-]);
int yy = Find(q[i][j]);
p[xx] = yy;///加入最小生成树
}
}
}
ansx += kruscal();
ans=min(ans,ansx);
}
printf("%lld\n",ans);
if(T) printf("\n");
}
return ;
}
每次求最小生成树的时候,都会加进去几条权值是0的边,一定会被选,剩下的边也一定会从裸求的最小生成树种找到。第一求的时候舍弃的边可以永远舍弃。
UVA 1151二进制枚举子集 + 最小生成树的更多相关文章
- 紫书 例题 11-3 UVa 1151 (有边集的最小生成树+二进制枚举子集)
标题指的边集是说这道题的套餐, 是由几条边构成的. 思路是先做一遍最小生成树排除边, 因为如果第一次做没有加入的边, 到后来新加入了很多权值为0的边,这些边肯定排在最前面,然后这条边的前面的那些边肯定 ...
- UVA - 1151 Buy or Build (买还是建)(并查集+二进制枚举子集)
题意:平面上有n个点(1<=n<=1000),你的任务是让所有n个点连通.可以新建边,费用等于两端点欧几里德距离的平方.也可以购买套餐(套餐中的点全部连通).问最小费用. 分析: 1.先将 ...
- UVA1354-Mobile Computing(二进制枚举子集)
Problem UVA1354-Mobile Computing Accept:267 Submit:2232 Time Limit: 3000 mSec Problem Description ...
- BZOJ1688|二进制枚举子集| 状态压缩DP
Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...
- Buy or Build UVA - 1151 Kruskal+枚举
题意: 大概意思是有 n 个点,现在有 q 个方案 ,第 i 个方案耗费为 ci ,使 Ni 个点联通 ,当然也可以直接使两点联通 ,现求最小生成树的代价. 两点直接联通的代价是欧几里得距离的平方: ...
- 杭电多校第十场 hdu6435 CSGO 二进制枚举子集
CSGO Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)Total Subm ...
- uva 11088 暴力枚举子集/状压dp
https://vjudge.net/problem/UVA-11088 对于每一种子集的情况暴力枚举最后一个三人小组取最大的一种情况即可,我提前把三个人的子集情况给筛出来了. 即 f[S]=MAX{ ...
- UVA 1151 买还是建(最小生成树)
买还是建 紫书P358 [题目链接]买还是建 [题目类型]最小生成树 &题解: 这题真的心累,看了3天,最后照着码还是wa,先放lrj代码,以后再看吧 &代码: // UVa1151 ...
- 南阳OJ-91-阶乘之和---二进制枚举(入门)
题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=91 题目大意: 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为 ...
随机推荐
- CSS3的@keyframes用法详解:
CSS3的@keyframes用法详解:此属性与animation属性是密切相关的,关于animation属性可以参阅CSS3的animation属性用法详解一章节. 一.基本知识:keyframes ...
- fiddler监听127.0.0.1或localhost
localhost/127.0.0.1的请求不会通过任何代理发送,fiddler也就无法截获. 解决方案 1,用 http://localhost. (locahost紧跟一个点号)2,用 http: ...
- CSS基础3
1.变形样式 transform : none | <transform-function>,改变元素的大小,透明,旋转角度,扭曲度等.<transform-function> ...
- 关于js异步上传文件
好久没登录博客园了,今天来一发分享. 最近项目里有个需求,上传文件(好吧,这种需求很常见,这也不是第一次遇到了).当时第一想法就是直接用form表单提交(原谅我以前就是这么干的),不过表单里不仅有文件 ...
- qt-creator astyle Peizhi
--style=ansi -s4 --pad-oper -S -N -L -m0 --add-brackets -M40 --suffix=none --convert-tabs %{CurrentD ...
- css外边距margin
- EF框架学习
简称EF,ADO.NET Entity Framework是微软以ADO.NET为基础所发展出来的对象关系对应(O/R Mapping)解决方案,是微软的一个ORM(面向对象的对象模型和关系型数据库的 ...
- koa框架异步返回值的操作(co,koa-compose)
最近在做demo的时候使用了koa框架,自己做了一个静态服务器,首先判断访问文件是否存在,在回调函数中设置了this.body,run之后,各种404,花了N长的时间把koa-compose和co模块 ...
- Spring 通过配置文件注入 properties文件
当我们需要将某些值放入 properties文件 key=value 的方式,获取文件信息使用spring 注入的方式会变得很便捷 1. spring 配置文件需要导入 <?xml versio ...
- android 有弹性的ScrollView 简单实现,与处理ScrollView和ListView,GridView之间的冲突
处理ScrollView和ListView,GridView之间的冲突, 最好的办法就是继承这两个类,重写他们的onMeasure方法即可: ListView: import android.widg ...