先求一次最小生成树,可以排除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. java.lang.ClassNotFoundException: com.radiadesign.catalina.session.RedisSessionHandlerValve

    org.apache.tomcat.util.digester.Digester.startElement Begin event threw exception java.lang.ClassNot ...

  2. Python笔记(七):字典、类、属性、对象实例、继承

    (一)  简单说明 字典是Python的内置数据结构,将数据与键关联(例如:姓名:张三,姓名是键,张三就是数据).例如:下面这个就是一个字典 {'姓名': '张三', '出生日期': '2899-08 ...

  3. AM调制的FPGA实现

    一.说明: 功能:AM调制 平台:Vivado 2016.4 和 Matlab R2017a 二.原理: 1. AM调制原理 AM已调信号的时域表达式: 已调信号的频域表达式: 本质上AM调制就是频谱 ...

  4. C# TCP 了解

    参考:http://www.jb51.net/article/118682.htm 一: TCP 粘包原理:发送方发送若干数据给接收方时粘成一包.从接收缓冲区看,后一包的头紧接前一包的数据的尾. 发送 ...

  5. 如何用Python爬虫实现百度图片自动下载?

    Github:https://github.com/nnngu/LearningNotes 制作爬虫的步骤 制作一个爬虫一般分以下几个步骤: 分析需求 分析网页源代码,配合开发者工具 编写正则表达式或 ...

  6. CString(转)

    CString::Compare int Compare( LPCTSTR lpsz ) const; 返回值   字符串一样  返回0 小于lpsz  返回-1 大于lpsz  返回1 区分大小字符 ...

  7. 【转】awk内置变量

    awk是个优秀文本处理工具,可以说是一门程序设计语言.下面是awk内置变量. 一.内置变量表 属性 说明 $0 当前记录(作为单个变量) $1~$n 当前记录的第n个字段,字段间由FS分隔 FS 输入 ...

  8. 高通ASOC中的machine驱动

    ASoC被分为Machine.Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的代码,再次引用上一节的内容:Machin ...

  9. Effective Java 之-----静态工厂与构造器

    一. 考虑用静态工厂方法代替构造器: 1)静态工厂方法与构造器不同的第一大优势在于:他们有名称.当一个类需要多个带有相同签名的构造器时,就用静态方法代替构造器,并慎重的选择名称以突出他们间的区别: 2 ...

  10. JavaScript 基本语法 -- 运算符的优先级

    在所有的运算里,都是有运算顺序的.小时候学四则运算的时候,我们都知道这么一个规则:先乘除后加减,有括号要先算括号! 同样的,在JavaScript里面,运算符也是有相应的优先级的.其优先级如下表所示, ...