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条边 ...
随机推荐
- Unity 几种碰撞模式
1.OnControllerColliderHit 事件 (角色控制器使用) 2.Physics.Raycast 函数 3.OnTriggerEnter 事件 (碰撞物体使用,给碰撞物体添加碰撞器, ...
- centos 6 SSH配置Google Authentication 验证
创建工作目录: mkdir google-authentication 1. 安装二维码生成依赖 #wget http://fukuchi.org/works/qrencode/qrencode-3. ...
- shape的简单用法
shap节点-----------------------------------定义shape的值,必须是下面的之一:"rectangle" 矩阵,这也是默认的shape&quo ...
- 谈谈自己对C语言中函数指针的一些理解 (第一次写博客,有点小兴奋哈)
1.函数指针声明的格式及简单的使用 (1)格式:(返回值)(*函数指针名)(参数列表) 例如:声明一个无参数无返回值的函数指针(void)(*p)(void). (2)将函数指针指向某个无参数无 ...
- PKU 1003解题
首先庆祝一下,今天连A了3题.感觉后面这题太简单了.. 由于英文不好 ,找了个翻译: 若将一叠卡片放在一张桌子的边缘,你能放多远?如果你有一张卡片,你最远能达到卡片长度的一半.(我们假定卡片都正放在桌 ...
- oracle xmltype导入并解析Excel数据 (一)创建表与序
表说明: T_EXCEL_IMPORT_DATASRC: Excel数据存储表,(使用了xmltype存储Excel数据) 部分字段说明: BUSINESSTYPE: Excel模板类型,一个Exce ...
- SqlServer性能优化索引(五)
导入表结构: select * into ProductCategory from AdventureWorksDW2014.dbo.DimProductCategory select * into ...
- New Training Table
2014_8_15 CodeForces 261 DIV2 A. Pashmak and Garden 简单题 B. Pashmak and Flowers 简单题 C. P ...
- go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )
go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 点击加入 文件操作 func Open(name string) (file *File ...
- 1.2 ASSEMBLY LANGUAGE
People are much happier moving up the ladder,socially or even technically.So our profession has move ...