/*
题意:有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的更多相关文章

  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 (枚举 + MST) Buy or Build

    题意: 平面上有n个点,现在要把它们全部连通起来.现在有q个套餐,如果购买了第i个套餐,则这个套餐中的点全部连通起来.也可以自己单独地建一条边,费用为两点欧几里得距离的平方.求使所有点连通的最小费用. ...

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

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

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

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

  9. uva 1151最小生成树

    先求一次最小生成树,可以排除n*(n*1)/2-(n-1)条边,每次利用二进制法枚举套餐的选择,套餐中的点直接处理,如果两个套餐有公共点直接合并,他们一定连通,然后枚举第一步最小生成树得到的n-1条边 ...

随机推荐

  1. 怎么把jdk和jRE的Javadoc文档整合到MyEclipse

    有时在写代码时,需要查看javadoc文档,便于编写程序.故如何把Javadoc文档整合到MyEclipse,以便于查看呢? 解决办法: 1.在MyEclipse中菜单栏的“Windows”---&g ...

  2. 作业七:团队项目——Alpha版本冲刺阶段005

    今日进展:编写代码. 今日安排:完成开始部分代码.

  3. 关于启动ubuntu中的nfs启动问题

    嵌入式开发,如果使用nfs挂载来启动内核和文件系统,这样便于调试文件系统和驱动,则首先要保证ubuntu开启nfs服务, 执行以下命令安装nfs服务,安装后自动运行 sudo apt-get inst ...

  4. JQ对象到底是什么

    jQuery对象是什么,举个例子,$('#id') 返回的就是jQuery对象,这个东西是整个jQuery的核心所在,所以我先来分析它. var jQuery = function( selector ...

  5. Command Pattern

    当(客户)对象访问(服务)请求服务时,最直接的方法就是方法调用.

  6. odi 12.2.1.1新特性

    ODI 12.2.1.1现在已经发布,也可以OTN上下载,主要变化: Hyperion Essbase and Hyperion Planning 知识模块 Hyperion Essbase and ...

  7. Tabbed Activity的使用(Fragment)

    1,首先file -> new -> Activity -> Tabbed Activity 2,创建完成后,发现会自动的创建一大堆代码,大部分我们是不需要关心的,关于页面切换的代码 ...

  8. array_filter函数

    利用array_filter函数轻松去掉多维空值,而数组的下标没有改变, 如果自定义过滤函数返回 true,则被操作的数组的当前值就会被包含在返回的结果数组中, 并将结果组成一个新的数组.如果原数组是 ...

  9. Ubuntu14.04安装build-essential失败,包依赖问题如何解决?

    正在读取软件包列表... 完成 正在分析软件包的依赖关系树        正在读取状态信息... 完成        有一些软件包无法被安装.如果您用的是 unstable 发行版,这也许是 因为系统 ...

  10. PKu 2195

    //PKu 2195 回家 By Loli_con Enail : Loli_con@outlook.com /* 题目叙述 ========= 在一个网格图中,有n个人和n个房子.每一个单位时间,每 ...