先求一次最小生成树,可以排除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最小生成树的更多相关文章

  1. UVa 1151 - Buy or Build(最小生成树)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. UVA 1151二进制枚举子集 + 最小生成树

    题意:平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此, 你可以新建一些边,费用等于两个端点的欧几里得距离的平方.另外还有q(0<=q<=8)个套餐(数 ...

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

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

  4. uva 1151(最小生成树,枚举子集)

    题意:平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此,你可以新建一些边,费用等于两个端点的欧几里得距离的平方.另外还有q(0<=q<=8)个套餐,可以 ...

  5. UVA 1151 Buy or Build (MST最小生成树,kruscal,变形)

    题意: 要使n个点之间能够互通,要使两点直接互通需要耗费它们之间的欧几里得距离的平方大小的花费,这说明每两个点都可以使其互通.接着有q个套餐可以选,一旦选了这些套餐,他们所包含的点自动就连起来了,所需 ...

  6. 【UVA 1151】 Buy or Build (有某些特别的东东的最小生成树)

    [题意] 平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此,你可以新建一些边,费用等于两个端点的欧几里得距离的平方. 另外还有q(0<=q<=8)个套餐 ...

  7. uva 1151 - Buy or Build poj 2784 Buy or Build(最小生成树)

    最小生成树算法简单 只是增加了一些新的东西,对于需要最小生成树算法 和中 并检查使用的一系列 还有一些更深入的了解. 方法的一些复杂问题 #include<cstdio> #include ...

  8. UVa 1151 Buy or Build (最小生成树+二进制法暴力求解)

    题意:给定n个点,你的任务是让它们都连通.你可以新建一些边,费用等于两点距离的平方(当然越小越好),另外还有几种“套餐”,可以购买,你购买的话,那么有些边就可以连接起来, 每个“套餐”,也是要花费的, ...

  9. UVA 1151 Buy or Build MST(最小生成树)

    题意: 在平面上有n个点,要让所有n个点都连通,所以你要构造一些边来连通他们,连通的费用等于两个端点的欧几里得距离的平方.另外还有q个套餐,可以购买,如果你购买了第i个套餐,该套餐中的所有结点将变得相 ...

随机推荐

  1. secureCRT sftp使用

    sftp-- help 可用命令: cd 路径 更改远程目录到"路径" lcd 路径 更改本地目录到"路径" chgrp group path 将文件" ...

  2. Jquery实现选项卡效果

    <script type="text/javascript"> $(document).ready(function(){ $('.ct:gt(0)').hide(); ...

  3. java IO(六):额外功能处理流

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  4. JMeter之断言 - 响应文本

    1.  响应数据: 2.  添加响应断言: 3.设置响应断言,本例中 设置 响应文本 中 包括 success 字符串的 为真,即通过. 4.如果设置 响应文本 中 包括 error 字符串的 为真, ...

  5. 【转】Linux 服务器安全配置

    第一部分:RedHat Linux篇1.概述 Linux服务器版本:RedHat Linux AS 2.1 对于开放式的操作系统---Linux,系统的安全设定包括系统服务最小化.限制远程存取.隐藏重 ...

  6. HTML学习——标签

    1.</hr>效果: 2.<q>简短文本引用, <blockquote>长文本引用, 表象:为文本添加一个双引号,实:一个语义,引用别人的话语. 3.&nb ...

  7. java对象引用-要掌握的细节

    hello ,好久没来了. 今天我来和大家分享一下有关引用变量的注意事项,一是加深一下自己的理解,二是对这块不太理解的同学可以看看. 大神可飘过,有什么不对或不足的地方请多多指教,谢谢. 假设场景: ...

  8. 《.NET 设计规范》第 3 章 命名规范

    <.NET 规范>第 3 章 命名规范 3.1 大小写约定 要把 PascalCasing 用于由多个单词构成的命名空间.类型以及成员的名字. 要把 camelCasing 用于参数的名字 ...

  9. Call to undefined function mysql_connect()错误原因

    从PHP5.0开始就不推荐使用mysql_connect()函数,到了php7.0则直接废弃了该函数,替代的函数是: mysqli_connect();

  10. 利用 secureCRT 直接上传下载文件 (sz,rz)

    在window下向linux传送文件的方法. 首先在window中安装SecureCRT,然后在快速连接中建立一个到linux的连接,当然,你要先知道你的系统的ip,在终端中键入ifconfig可以查 ...