UVA 1151
/*
题意:有n个点,现在需要联通所有,有q种套餐可以选择,
当然套餐之外也可以自己添加边,意为达到最短距离。 题意很明显,不知道需要使用哪一种套餐,
那么需要枚举每一种套餐的情况。
然后再进行对比。
注意最开始没有套餐的情况。
*/ #include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector> using namespace std; const int maxn = ; class Cor
{
public:
int x,y;
}cor[maxn]; //坐标 class Node
{
public:
int x,y;
int dis;
}edge[maxn*maxn]; //边 vector<int>t[];
int cost[]; //每中套餐的花费
int n,m,q;
int f[maxn]; bool cmp(Node a,Node b)
{
return a.dis < b.dis;
} double distances(Cor a,Cor b)
{
int dx = a.x - b.x;
int dy = a.y - b.y;
return (dx*dx + dy*dy);
} void inti(int n)
{
for(int i = ;i <= n; i++)
f[i] = i;
return ;
} int Find(int x)
{
int r = x;
while(r != f[r])
r = f[r];
int i = x,j;
while(f[i] != r){
j = f[i];
f[i] = r;
i = j;
}
return r;
} int merge(int x,int y)
{
int a = Find(x);
int b = Find(y);
if(a == b)
return false;
else
f[a] = b;
return true;
} int kruskal() //标准的kruskal
{
int pos = ,sum = ;
for(int i = ;i < m && pos < n - ; i++){
if(merge(edge[i].x,edge[i].y)){
pos++;
sum += edge[i].dis;
}
}
return sum;
} void solve()
{
inti(n);
int ans = kruskal(); //初始的情况
for(int i = ;i < (<<q); i++){
int money = ;
inti(n);
for(int j = ;j < q; j++){ //枚举每一种套餐的情况
// if((i>>j)&1) continue;
if(i&(<<j)){
money += cost[j];
for(int k = ;k < t[j].size(); k++){
merge(t[j][k],t[j][]); //把套餐的点相连
}
}
}
ans = min(ans,kruskal() + money);
}
printf("%d\n",ans);
return ;
} int main()
{
// freopen("in.txt","r",stdin);
int ncase,pn = ;
scanf("%d",&ncase);
while(ncase--){
if(pn > ) //UVA的输出
printf("\n");
pn++;
for(int i = ;i < ; i++) //要清理,初始化
t[i].clear();
scanf("%d%d",&n,&q);
for(int i = ;i < q; i++){ //vector是把每一种套餐记录,
// 因为不知道每一种套餐有几个点,所以用vector很合适
int num,temp;
scanf("%d%d",&num,&cost[i]);
for(int j = ;j < num; j++){
scanf("%d",&temp);
t[i].push_back(temp);
}
}
for(int i = ;i <= n; i++)
scanf("%d%d",&cor[i].x,&cor[i].y);
m = ;
for(int i = ;i <= n; i++){
for(int j = i + ;j <= n; j++){
edge[m].x = i;
edge[m].y = j;
edge[m++].dis = distances(cor[i],cor[j]);//计算每一条边的长度
}
}
sort(edge,edge+m,cmp); //kruskal特有
solve();
}
return ;
}
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 (枚举 + MST) Buy or Build
题意: 平面上有n个点,现在要把它们全部连通起来.现在有q个套餐,如果购买了第i个套餐,则这个套餐中的点全部连通起来.也可以自己单独地建一条边,费用为两点欧几里得距离的平方.求使所有点连通的最小费用. ...
- 【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最小生成树
先求一次最小生成树,可以排除n*(n*1)/2-(n-1)条边,每次利用二进制法枚举套餐的选择,套餐中的点直接处理,如果两个套餐有公共点直接合并,他们一定连通,然后枚举第一步最小生成树得到的n-1条边 ...
随机推荐
- JS 跑马灯
利用jquery 来实现图片切换.文字转换移动的工具. MSClass 连接 http://www.popub.net/script/MSClass.html Mark 用
- runtime学习实战一:类的属性进行归档解档
#import <Foundation/Foundation.h> @interface PYPerson : NSObject @property (nonatomic, assign) ...
- SQL变量、Substring、charindex、case函数、去除重复
isnull(aa,0)删除表数据: truncate table aaa 添加字段: ALTER TABLE table1 ADD col1 varchar(200) DEFAULT '2008 ...
- U盘被写保护如何解除 (转)
U盘被写保护如何解除 在使用U盘的时候,一直都很正常,但是突然有一天,U盘被提示被写保护了,不能够进行读写数据,如果这时正着急使用,一定会被气疯了吧,其实解决这个问题,是非常简单的. U盘被写保护 ...
- 《java中异常和错误》
异常和错误的区别. 异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发 ...
- java 多线程
1.继承Thread类实现多线程继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是 ...
- python入门笔记
创建变量 python的变量不需要声明数据类型. >>> fred=100 >>> print (fred) 100 >>> fred 100 创 ...
- spring注解说明之Spring2.5 注解介绍(3.0通用)
spring注解说明之Spring2.5 注解介绍(3.0通用) 注册注解处理器 方式一:bean <bean class="org.springframework.beans.fac ...
- 从UWP到SWIFT-页面间反向传值
页面1跳转到页面2,在页面2点击button后,页面1的内容被改变.实际使用 protocol(就是c#中的interface),将页面1的viewcontroller转换为protocol传入页面2 ...
- php大力力 [055节] 大力力阅读文章集锦
php大力力 [055节] 效率低啊,效率低 啥也不说了,先把网页挨个保存一下,关闭网页窗口 从 2015-09-11 10:58 到 2015-09-11 12:38 共用了100分钟,整理最近几天 ...