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是不是一些数(这些数不允许重复使用,且为 ...
随机推荐
- Python 修饰符
def hello(fn): def wrapper(): print "hello" fn() print "goodb ...
- Fragment:关于Avoid non-default constructors in fragments的错误
在android开发中,写了一个关于继承Fragment的类时,如果有重载构造函数时,会提示“Avoid non-default constructors in fragments: use a de ...
- [转]搭建高可用mongodb集群(四)—— 分片
按照上一节中<搭建高可用mongodb集群(三)—— 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...
- classLIST元素增删改查方法
window.onload=function () { var oDiv=document.getElementsByTagName('div')[0]; var oInP=document.getE ...
- Leetcode 详解(Valid Number)
Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...
- Asp.net页面引用SAP IQ 16 iAnywhere.Data.SQLAnywhere.V4.0.dll报错,语言文件没找到
参考http://sqlanywhere-forum.sap.com/questions/20420/saconnection-threw-an-exception-cannot-find-the-l ...
- EntityFrame Work:No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'
今天试着学习了Entity Frame Work遇到的问题是 The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlP ...
- Win8 传统桌面下无法上网的解决方法
Win8 很酷,就连出现的问题也都酷得不行~ 之前遇到的一些问题与解决方法,避免重新安装 1. Word 2013下, 输入法突然秀逗, 经常按了一个键后, 死循环输入该字符直到死机 解决方法: 进入 ...
- ASP通过ADODB读取Access数据库
<% On Error Resume Next set conn=server.createobject("adodb.connection") mypath=server. ...
- CentOS 6.4下PXE+Kickstart无人值守安装操作系统
http://www.cnblogs.com/mchina/p/centos-pxe-kickstart-auto-install-os.html