先求一次最小生成树,可以排除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. 流API--缩减操作

    在Stream流操作中,比如说min(),max(),count()方法,这几个操作都会将一个流缩减成一个值,流API将这些操作称为特例缩减.另外,流API同时泛华了缩减这种概念,提供了reduce( ...

  2. JAVA学习,是一条漫长的道路

    我在Java 1.0正式问世前就开始学习Java,这么多年过去了,到现在我的Java学习历程还没有停过.我阅读原文书,研究原始码,撰写程序,自认为走得扎实,不奢望一步登天.像我这样老式的学习方式,显然 ...

  3. 03_HTML Canvas第一天

    视频来源:麦子学院 讲师:刘慧涛 w3cshool之HTML5画布:http://www.w3school.com.cn/html5/html_5_canvas.asphtml5 canvas参考手册 ...

  4. Angular之ngRoute与uiRoute

    ngRoute不支持嵌套路由 用法如下: <!DOCTYPE html> <html lang="en" ng-app="myApp"> ...

  5. linux命令读取文件中特定行

    1.如果你只想看文件的前5行,可以使用head命令, 如: head -5 /etc/passwd 2.如果你想查看文件的后10行,可以使用tail命令, 如: tail -10 /etc/passw ...

  6. hexo建立github,gitcafe博客并实时同步的要点

    把hexo博客的源码和生成的页面实时同步到github和gitcafe. 用搜索引擎搜索"github 博客"等关键字会出现大量很好的文章教小白一步步搭建.我这里列出一些关键点,希 ...

  7. iOS-NSPredicate正则验证【三种验证方法】

    1.NSPredicate验证(谓词匹配) ///验证(string:验证的字符串) + (BOOL)stringValidate:(NSString *)string{ NSString *regu ...

  8. dfs_SPFA 判负环

    感觉有点像tarjan求SCC #include <iostream> #include <cstdio> #include <algorithm> #includ ...

  9. CF 570D. Tree Requests [dsu on tree]

    传送门 题意: 一棵树,询问某棵子树指定深度的点能否构成回文 当然不用dsu on tree也可以做 dsu on tree的话,维护当前每一个深度每种字母出现次数和字母数,我直接用了二进制.... ...

  10. 数组的复制及ES6数组的扩展

    一.数组的复制 // alert([1,2,3]==[1,2,3]); let cc = [0,1,2]; let dd = cc; alert(dd==cc);//此时改变dd会影响cc ES5 只 ...