uva 1151最小生成树
先求一次最小生成树,可以排除n*(n*1)/2-(n-1)条边,每次利用二进制法枚举套餐的选择,套餐中的点直接处理,如果两个套餐有公共点直接合并,他们一定连通,然后枚举第一步最小生成树得到的n-1条边就能够得到在购买当前套餐下能得到的最优解。
注意:修建两点之间的道路的费用是欧几里德距离的平方。
AC代码:
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int maxn=1000+5;
const int inf=1<<30;
int n,q,cnt;
int px[maxn],py[maxn],p[maxn],vis[maxn];
struct node{
int a,b;
int w;
bool operator <(const node &p)const {
return w<p.w;
}
}e[maxn*maxn/2],ex[maxn];
struct net{
int cnt;
int point[maxn];
int w;
}c[10];
inline int find(int x){
return p[x]==x?x:find(p[x]);
}
int kru(int h){
int ans=0;
for(int i=0;i<n;++i) p[i]=i;
memset(vis,0,sizeof(vis));
for(int i=0;i<q;++i){
if((h>>i)&1){
ans+=c[i].w;
int k=c[i].point[0];
for(int j=0;j<c[i].cnt;++j){
if(vis[c[i].point[j]]) {
k=find(c[i].point[j]);
break;
}
}
for(int j=0;j<c[i].cnt;++j){
if(!vis[c[i].point[j]]) p[c[i].point[j]]=k;
vis[c[i].point[j]]=1;
}
}
}
for(int i=0;i<n-1;++i){
int x=find(ex[i].a), y=find(ex[i].b);
if(x!=y){
ans+=ex[i].w;
p[y]=x;
}
}
return ans;
}
int solve(){
int ans=inf;
sort(e,e+cnt);
for(int i=0;i<n;++i) p[i]=i;
int c2=0;
for(int i=0;i<cnt;++i){
int x=find(e[i].a), y=find(e[i].b);
if(x!=y){
p[y]=x;
ex[c2++]=e[i];
}
}
for(int i=0;i<(1<<q);++i){
ans=min(ans,kru(i));
}
return ans;
}
int main(){
int T;
scanf("%d",&T);
int kase=0;
while(T--){
if(kase++) printf("\n");
scanf("%d%d",&n,&q);
for(int i=0;i<q;++i){
scanf("%d%d",&c[i].cnt,&c[i].w);
for(int j=0;j<c[i].cnt;++j) {
scanf("%d",&c[i].point[j]);
c[i].point[j]--;
}
}
for(int i=0;i<n;++i) scanf("%d%d",&px[i],&py[i]);
cnt=0;
for(int i=0;i<n;++i)
for(int j=i+1;j<n;++j){
e[cnt].a=i; e[cnt].b=j;
e[cnt++].w=(px[i]-px[j])*(px[i]-px[j])+(py[i]-py[j])*(py[i]-py[j]);
}
printf("%d\n",solve());
}
return 0;
}
如有不当之处欢迎指出!
uva 1151最小生成树的更多相关文章
- UVa 1151 - Buy or Build(最小生成树)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 1151二进制枚举子集 + 最小生成树
题意:平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此, 你可以新建一些边,费用等于两个端点的欧几里得距离的平方.另外还有q(0<=q<=8)个套餐(数 ...
- UVA 1151 买还是建(最小生成树)
买还是建 紫书P358 [题目链接]买还是建 [题目类型]最小生成树 &题解: 这题真的心累,看了3天,最后照着码还是wa,先放lrj代码,以后再看吧 &代码: // UVa1151 ...
- uva 1151(最小生成树,枚举子集)
题意:平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此,你可以新建一些边,费用等于两个端点的欧几里得距离的平方.另外还有q(0<=q<=8)个套餐,可以 ...
- UVA 1151 Buy or Build (MST最小生成树,kruscal,变形)
题意: 要使n个点之间能够互通,要使两点直接互通需要耗费它们之间的欧几里得距离的平方大小的花费,这说明每两个点都可以使其互通.接着有q个套餐可以选,一旦选了这些套餐,他们所包含的点自动就连起来了,所需 ...
- 【UVA 1151】 Buy or Build (有某些特别的东东的最小生成树)
[题意] 平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此,你可以新建一些边,费用等于两个端点的欧几里得距离的平方. 另外还有q(0<=q<=8)个套餐 ...
- uva 1151 - Buy or Build poj 2784 Buy or Build(最小生成树)
最小生成树算法简单 只是增加了一些新的东西,对于需要最小生成树算法 和中 并检查使用的一系列 还有一些更深入的了解. 方法的一些复杂问题 #include<cstdio> #include ...
- UVa 1151 Buy or Build (最小生成树+二进制法暴力求解)
题意:给定n个点,你的任务是让它们都连通.你可以新建一些边,费用等于两点距离的平方(当然越小越好),另外还有几种“套餐”,可以购买,你购买的话,那么有些边就可以连接起来, 每个“套餐”,也是要花费的, ...
- UVA 1151 Buy or Build MST(最小生成树)
题意: 在平面上有n个点,要让所有n个点都连通,所以你要构造一些边来连通他们,连通的费用等于两个端点的欧几里得距离的平方.另外还有q个套餐,可以购买,如果你购买了第i个套餐,该套餐中的所有结点将变得相 ...
随机推荐
- js_1_变量类型
js中有哪些变量类型? 数字(包括int和float),字符串,数组(字典,js没有字典类型,把字典看成一个对象) 如何把字符转成数字呢? obj.parseInt() // 转化成 ...
- @media 针对不同的屏幕尺寸设置不同的样式
@media screen and (max-width: 800px) { #yanandownload .close input { margin-right: 40px ; } ...
- java常用类--字符串
String import java.io.IOException; import java.util.Arrays; public class Linkin { public static void ...
- 定时任务schedule(spring boot )
1. 定时任务实现方式:SpringBoot自带的Scheduled,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多,本文主要介绍. 执行方式:单线程(串行)多线程(并行) ...
- webpack从0开始---(二)
直接使用webpack进行打包 安装css loader,style loader(用来处理打包css文件) 命令行输入npm install css-loader style-loader --sa ...
- CentOS修改Tomcat端口号
Linux下修改Tomcat默认端口 1.方法一 假设tomcat所在目录为/usr/local/apache-tomcat/ 1.打开tomcat配置文件 # vi /usr/local/apach ...
- Android 使用android-support-multidex解决Dex超出方法数的限制问题
随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sdk或者公共支持的jar包,项目耦合性高,重复作用的类越来越多),相信很多人都遇到过如下的错误: UNEXPECTED TOP-LE ...
- nodejs爬虫笔记(三)---爬取YouTube网站上的视频信息
思路:通过笔记(二)中代理的设置,已经可以对YouTube的信息进行爬取了,这几天想着爬取网站下的视频信息.通过分析YouTube,发现可以从订阅号入手,先选择几个订阅号,然后爬取订阅号里面的视频分类 ...
- 【转】GPS误差来源
一.与GPS卫星有关的误差 1.卫星时钟误差 即使卫星是非常的精密复杂,它可以计算出一些极微小的讯息信息,如原子钟(Cesium) 即是如此一个精准的装置,但是精准并不代表完美,因此仍会有一些微小的误 ...
- template()方法
template(id, data)方法: id:必传,渲染模板的id. data:可选,一个Object对象. return:传data—>渲染完成html代码:不传data—>一个渲染 ...