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条边 ...
随机推荐
- as3 代码优化之pmd
首先下载com.abobe,ac.pmd.eclipse_...jar 和 flex-pmd-all-in-one...zip俩文件 前面一个装在xx\adobe flash builder xx\e ...
- python获取指定时间段内的随机不重复的时间点
上篇 <python时间时分秒与秒数的互相转换>http://www.cnblogs.com/gayhub/p/6154707.html 提到了把时间转成秒数的方法, 这篇写写转换成秒数后 ...
- Type.GetType()反射另外项目中的类时返回null的解决方法
项目1:ProjectA namespace ProjectA { public class paa { .... } } Type.GetType("paa")返回null Ty ...
- DOM扩展之HTML5 插入标记
11.3.6 插入标记 当需要在文档中插入大量的HTML标记时,通过DOM操作就会是非常麻烦的,相对而言,使用插入标记的技术,直接插入HTML字符串不仅简单而且更快.以下插入标记相关的DOM操作已经纳 ...
- oracle查询包含某个字段的表
select column_name,table_name,data_type ,data_length,data_precision,data_scale from DBA_TAB_COLUMNS ...
- Postgresql存储过程调试:PostgreSQL 之 Function NOTICE
转载自http://zhenghaoju700.blog.163.com/blog/static/13585951820116782843994/ 先安装一个PostgreSQL(见补充知识) 比较O ...
- 自增序号,而且默认变量就是$i,也就是说在你的volist标签之内,可以直接使用$i
<volist name="vlist" id="v"> <{$i}> // 直接使用$i </volist>
- UE4 中Struct Emum 类型的定义方式 笔记
UE4 基础,但是不经常用总是忘记,做个笔记加深记忆: 图方便就随便贴一个项目中的STRUCT和 Enum 的.h 文件 Note:虽然USTRUCT可以定义函数,但是不能加UFUNCTION 标签喔 ...
- ORACLE存储过程学习
存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE ...
- win32自绘按钮,使用GDI+(一)
第一次写随笔,我本来想将win32窗口的标题栏设置成渐变色,像这样的效果 但发现找不到设置标题栏属性的api,SetWindowLong也只是增减窗口的固定的样式而已.所以想到一个思路,把标题栏去掉, ...