【题意】

  平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此,你可以新建一些边,费用等于两个端点的欧几里得距离的平方。

另外还有q(0<=q<=8)个套餐,可以购买,如果你购买了第i个套餐,该套餐中的所有结点将变得相互连通,第i个套餐的花费为ci。

求最小花费。

Input
 (1 ≤ n ≤ 1000)  (0 ≤ q ≤ 8).

The second integer is the the cost of the subnetwork
(not greater than 2 × 10^6). integer values (ranging from 0 to 3000) 
Output

...

Sample Input
1
7 3
2 4 1 2
3 3 3 6 7
3 9 2 4 5
0 2
4 0
2 0
4 2
1 3
0 5
4 4
Sample Output
17

【分析】

  枚举套餐哦。其实生成树问题多一些东东的话都是枚举的吧?吗?
  你一开始先排序好,枚举完就不用排序了。

LRJ说什么只考虑最小生成树上的边优化版本:

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define Maxn 1010
#define INF 0xfffffff int a[][Maxn],c[];
int nx[Maxn],ny[Maxn];
int n,q; struct node
{
int x,y,c;
}t[Maxn*Maxn];
int len,nl; void ins(int x,int y,int c)
{
t[++len].x=x;t[len].y=y;t[len].c=c;
} bool cmp(node x,node y) {return x.c<y.c;} int mymin(int x,int y) {return x<y?x:y;}
int mymax(int x,int y) {return x>y?x:y;} int fa[Maxn];
int ffa(int x)
{
if(fa[x]!=x) fa[x]=ffa(fa[x]);
return fa[x];
} void ffind()
{
int ans=INF;
for(int i=;i<(<<q);i++)
{
int now=;
for(int j=;j<=n;j++) fa[j]=j;
int ft=-;
for(int j=;j<=q;j++) if((<<j-)&i)
{
for(int k=;k<=a[j][];k++)
fa[ffa(a[j][k])]=ffa(a[j][]);
now+=c[j];
}
int cnt=;
for(int j=;j<=n;j++) if(ffa(j)==j) cnt++;
for(int j=;j<=nl;j++)
{
if(ffa(t[j].x)!=ffa(t[j].y))
{
fa[ffa(t[j].x)]=ffa(t[j].y);
now+=t[j].c;
cnt--;
}
if(cnt==) break;
}
ans=mymin(ans,now);
}
printf("%d\n",ans);
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&q);
for(int i=;i<=q;i++)
{
scanf("%d%d",&a[i][],&c[i]);
for(int j=;j<=a[i][];j++) scanf("%d",&a[i][j]);
}
for(int i=;i<=n;i++)
{
scanf("%d%d",&nx[i],&ny[i]);
}
len=;
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
{
// double xx=(double)(nx[i]-nx[j]),yy=(double)(ny[i]-ny[j]);
int xx=nx[i]-nx[j],yy=ny[i]-ny[j];
ins(i,j,xx*xx+yy*yy);
}
sort(t+,t++len,cmp);
int cnt=;nl=;
for(int i=;i<=n;i++) fa[i]=i;
for(int i=;i<=len;i++)
{
if(ffa(t[i].x)!=ffa(t[i].y))
{
fa[ffa(t[i].x)]=ffa(t[i].y);
cnt++;
t[++nl]=t[i];
}
if(cnt==n-) break;
}
ffind();
if(T) printf("\n");
}
return ;
}

- -

其实我觉得不用也没什么??反正都排序选前面的,区别??

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define Maxn 1010
#define INF 0xfffffff int a[][Maxn],c[];
int nx[Maxn],ny[Maxn];
int n,q; struct node
{
int x,y,c;
}t[Maxn*Maxn];
int len,nl; void ins(int x,int y,int c)
{
t[++len].x=x;t[len].y=y;t[len].c=c;
} bool cmp(node x,node y) {return x.c<y.c;} int mymin(int x,int y) {return x<y?x:y;}
int mymax(int x,int y) {return x>y?x:y;} int fa[Maxn];
int ffa(int x)
{
if(fa[x]!=x) fa[x]=ffa(fa[x]);
return fa[x];
} void ffind()
{
int ans=INF;
for(int i=;i<(<<q);i++)
{
int now=;
for(int j=;j<=n;j++) fa[j]=j;
int ft=-;
for(int j=;j<=q;j++) if((<<j-)&i)
{
for(int k=;k<=a[j][];k++)
fa[ffa(a[j][k])]=ffa(a[j][]);
now+=c[j];
}
int cnt=;
for(int j=;j<=n;j++) if(ffa(j)==j) cnt++;
for(int j=;j<=len;j++)
{
if(ffa(t[j].x)!=ffa(t[j].y))
{
fa[ffa(t[j].x)]=ffa(t[j].y);
now+=t[j].c;
cnt--;
}
if(cnt==) break;
}
ans=mymin(ans,now);
}
printf("%d\n",ans);
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&q);
for(int i=;i<=q;i++)
{
scanf("%d%d",&a[i][],&c[i]);
for(int j=;j<=a[i][];j++) scanf("%d",&a[i][j]);
}
for(int i=;i<=n;i++)
{
scanf("%d%d",&nx[i],&ny[i]);
}
len=;
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
{
// double xx=(double)(nx[i]-nx[j]),yy=(double)(ny[i]-ny[j]);
int xx=nx[i]-nx[j],yy=ny[i]-ny[j];
ins(i,j,xx*xx+yy*yy);
}
sort(t+,t++len,cmp);
/*int cnt=0;nl=0;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=len;i++)
{
if(ffa(t[i].x)!=ffa(t[i].y))
{
fa[ffa(t[i].x)]=ffa(t[i].y);
cnt++;
t[++nl]=t[i];
}
if(cnt==n-1) break;
}*/
ffind();
if(T) printf("\n");
}
return ;
}

像是没有区别= =

2016-11-01 22:24:10

【UVA 1151】 Buy or Build (有某些特别的东东的最小生成树)的更多相关文章

  1. UVA 1151 Buy or Build (MST最小生成树,kruscal,变形)

    题意: 要使n个点之间能够互通,要使两点直接互通需要耗费它们之间的欧几里得距离的平方大小的花费,这说明每两个点都可以使其互通.接着有q个套餐可以选,一旦选了这些套餐,他们所包含的点自动就连起来了,所需 ...

  2. UVa 1151 - Buy or Build(最小生成树)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. UVA 1151 Buy or Build MST(最小生成树)

    题意: 在平面上有n个点,要让所有n个点都连通,所以你要构造一些边来连通他们,连通的费用等于两个端点的欧几里得距离的平方.另外还有q个套餐,可以购买,如果你购买了第i个套餐,该套餐中的所有结点将变得相 ...

  4. UVA 1151 Buy or Build (最小生成树)

    先求出原图的最小生成树,然后枚举买哪些套餐,把一个套餐内的点相互之间边权为0,直接用并查集缩点.正确性是基于一个贪心, 在做Kruskal算法是,对于没有进入最小生成树的边,排序在它前面的边不会减少. ...

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

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

  6. UVa 1151 Buy or Build (最小生成树+二进制法暴力求解)

    题意:给定n个点,你的任务是让它们都连通.你可以新建一些边,费用等于两点距离的平方(当然越小越好),另外还有几种“套餐”,可以购买,你购买的话,那么有些边就可以连接起来, 每个“套餐”,也是要花费的, ...

  7. UVa 1151 Buy or Build【最小生成树】

    题意:给出n个点的坐标,现在需要让这n个点连通,可以直接在点与点之间连边,花费为两点之间欧几里得距离的平方,也可以选购套餐,套餐中所含的点是相互连通的 问最少的花费 首先想kruskal算法中,被加入 ...

  8. UVA - 1151 Buy or Build (买还是建)(并查集+二进制枚举子集)

    题意:平面上有n个点(1<=n<=1000),你的任务是让所有n个点连通.可以新建边,费用等于两端点欧几里德距离的平方.也可以购买套餐(套餐中的点全部连通).问最小费用. 分析: 1.先将 ...

  9. UVA 1151 买还是建(最小生成树)

    买还是建 紫书P358 [题目链接]买还是建 [题目类型]最小生成树 &题解: 这题真的心累,看了3天,最后照着码还是wa,先放lrj代码,以后再看吧 &代码: // UVa1151 ...

  10. POJ(2784)Buy or Build

    Buy or Build Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1369   Accepted: 542 Descr ...

随机推荐

  1. ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值

    检查插入的值是否大于该字段数据类型约束的长度. 这个异常是指,用户向数据库执行插入数据操作时,某条数据的某个字段值过长,如 果是varchar2类型的,当长度超过2000,--4000(最大值)之间的 ...

  2. html-01

    1.HTML:超文本标记语言,由浏览器解析成页面.html文件是以.html或者 .htm 2.HTML的作用   |- 控制页面的外观.   |- 发布帮助文档 3.常见的浏览器    |-IE:微 ...

  3. Nginx 简单的负载均衡配置示例

    http://www.cnblogs.com/xiaogangqq123/archive/2011/03/02/1969006.html 在此记录下Nginx服务器nginx.conf的配置文件说明, ...

  4. 将商品SKU数据按商品分组,组装成json数据

    需要封装的数据   将这些数据,分组出来,OLGoodsID相同的为一组,然后每个组的OLSKUID,放在一个字段里,变成 [{"OLGoodID":"test06261 ...

  5. T-SQL基础 (子查询,连接查询,交叉查询,事务|| 笔记0807)

    一: A.子查询: 1.select 字段名 from table where 字段名=(select 字段名 from table 条件)  //只能做1个匹配 2.select 字段名 from ...

  6. 那天有个小孩跟我说LINQ(三)转载

    1  LINQ TO Objects续2(代码下载)      新建项目 linq_Ch3控制台程序    1.1 操作字符串        ①查找字符串中包含的大写字母,字符串是由多个char类型组 ...

  7. python常用函数 库 转

    可能经常用到的标准模块和第三方常用的50个库 本文由python培训班授课老师整理 数学计算:     numbers - Numeric abstract base classes     math ...

  8. ios 消息跳转处理

    一.消息转发流程 当向Objective-C对象发送一个消息,但runtime在当前类及父类中找不到此selector对应的方法时,消息转发(message forwarding)流程开始启动. 动态 ...

  9. (hdu)5546 Ancient Go

    Problem Description Yu Zhou likes to play Go with Su Lu. From the historical research, we found that ...

  10. 九度OJ 1371 最小的K个数 -- 堆排序

    题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...