先求出原图的最小生成树,然后枚举买哪些套餐,把一个套餐内的点相互之间边权为0,直接用并查集缩点。正确性是基于一个贪心,

在做Kruskal算法是,对于没有进入最小生成树的边,排序在它前面的边不会减少。

边比较多,用prim求最小生成树,效果比Kruskal好,枚举套餐的时候在用Kruskal。

prim和dijkstra的区别在于点距离的定义。

#include<bits/stdc++.h>
using namespace std;
const int maxn = ;
int n,q; int C[];
vector<int> Buy[];
#define PB push_back int x[maxn],y[maxn];
#define squ(x) ((x)*(x)) int dist(int a,int b) { return squ(x[a]-x[b])+squ(y[a]-y[b]); } struct Edge
{
int u,v,w;
Edge(){}
Edge(int u,int v,int w):u(u),v(v),w(w){}
bool operator < (const Edge& x) const {
return w > x.w;
}
}edges[maxn]; bool EdgeLess(const Edge &x,const Edge &y) { return x.w < y.w; } int ecnt; int d[maxn];
bool done[maxn];
const int INF = 0x3f3f3f3f; int Prim()
{
fill(d,d+n,INF);
fill(done,done+n,);
ecnt = ;
priority_queue<Edge> q;
q.push(Edge(-,,)); // dummy edge
int tot = d[] = ;
while(q.size()){
Edge x = q.top(); q.pop();
if(done[x.v]) continue;
edges[ecnt++] = x;
tot += x.w;
done[x.v] = true;
for(int i = ; i < n; i++){
if(done[i]) continue;
int cost = dist(x.v,i);
if(d[i]>cost){
d[i] = cost;
q.push(Edge(x.v,i,cost));
}
}
}
return tot;
} int pa[maxn];
int Find(int x) { return x==pa[x]?x:pa[x]=Find(pa[x]); }
void Union(int a,int b,int &cnt)
{
int s1 = Find(a),s2 = Find(b);
if(s1 != s2){
pa[s1] = s2; cnt--;
}
} int Kruskal(int cnt)
{
if(!cnt) return ;
int ans = ;
for(int i = ; i < ecnt; i++){
Edge &e = edges[i];
int s1 = Find(e.u), s2 = Find(e.v);
if(s1 != s2) { ans += e.w; pa[s1] = s2; cnt--; if(!cnt) return ans; } }
return ans;
} int main()
{
//freopen("in.txt","r",stdin);
int T; scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&q);
for(int i = ; i < q; i++){
int t; scanf("%d%d",&t,C+i);
Buy[i].clear();
while(t--) {
int c; scanf("%d",&c);
Buy[i].PB(c-);
}
}
for(int i = ; i < n; i++){
scanf("%d%d",x+i,y+i);
}
int ans = Prim();
sort(edges+,edges+ecnt,EdgeLess); for(int mask = ,M = <<q; mask < M; mask++){
for(int i = ; i < n; i++) pa[i] = i;
int tot = ,cnt = n-; for(int i = ; i < q; i++){
if(mask&<<i){
tot += C[i];
for(int j = ; j < Buy[i].size(); j++) {
Union(Buy[i][],Buy[i][j],cnt);
}
}
} tot += Kruskal(cnt);
ans = min(ans,tot);
}
printf("%d\n",ans);
if(T) putchar('\n');
}
return ;
}

UVA 1151 Buy or Build (最小生成树)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. UVA 1151二进制枚举子集 + 最小生成树

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

随机推荐

  1. 【Linux学习】Vi / Vim编辑器—编辑器工作模式、vi编辑操作

    Vi / Vim编辑器-编辑器工作模式.vi编辑操作 推荐一个很好的学习指南:http://www.oschina.net/translate/learn-vim-progressively 一.编辑 ...

  2. 对比<input type="text" id="">和<asp:TextBox runat="server" ID="">

    首先这两个都是对应文本输入框形式: <input type="text"class="form-control"id="txt_add_pro_ ...

  3. jQuery EasyUI API 中文文档 - Tree树使用介绍

    用 $.fn.tree.defaults 重写了 defaults. 依赖 draggable droppable 用法 Tree 能在 <ul> 元素里定义,此标记可以定义为叶节点和子节 ...

  4. MR 图像分割 相关论文摘要整理

    <多分辨率水平集算法的乳腺MR图像分割> 针对乳腺 MR 图像信息量大.灰度不均匀.边界模糊.难分割的特点, 提出一种多分辨率水平集乳腺 MR图像分割算法. 算法的核心是首先利用小波多尺度 ...

  5. 七牛上传图片视频demo

    /引入Plupload .qiniu.js后 varuploader = Qiniu.uploader({ runtimes:'html5,flash,html4',//上传模式,依次退化 brows ...

  6. thinkphp5.0 页面缓存

    在application\config.php里加 //以下为静态缓存配置 'app_debug' => false,//false为开启静态缓存模式 'html_cache_on' => ...

  7. Java常见设计模式学习(非原创)

    文章大纲 一.策略模式二.观察者模式三.工厂模式四.单例模式五.其他模式六.设计模式总结七.参考文章   一.策略模式 现在假设我们有个"鸭子项目",首先我们用OOP(面向对象)的 ...

  8. LVS-DR VIP和RIP不同网段的配置方法

    http://blog.itpub.net/25723371/viewspace-1446935/

  9. 快速对接payjs的个人支付接口(收银台模式)

    近期在了解个人支付接口,希望能解决我在微信上支付的问题.找了很多平台对比再三,感觉payjs比较专业,其它多是模仿payjs的东西.同时支持支付宝和微信,由于本人支付宝还没开通(需要有一定流量才给开通 ...

  10. JPA_day01