UVA 1151 Buy or Build (最小生成树)
先求出原图的最小生成树,然后枚举买哪些套餐,把一个套餐内的点相互之间边权为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 (最小生成树)的更多相关文章
- UVa 1151 - Buy or Build(最小生成树)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 1151 Buy or Build MST(最小生成树)
题意: 在平面上有n个点,要让所有n个点都连通,所以你要构造一些边来连通他们,连通的费用等于两个端点的欧几里得距离的平方.另外还有q个套餐,可以购买,如果你购买了第i个套餐,该套餐中的所有结点将变得相 ...
- UVA 1151 Buy or Build (MST最小生成树,kruscal,变形)
题意: 要使n个点之间能够互通,要使两点直接互通需要耗费它们之间的欧几里得距离的平方大小的花费,这说明每两个点都可以使其互通.接着有q个套餐可以选,一旦选了这些套餐,他们所包含的点自动就连起来了,所需 ...
- uva 1151 - Buy or Build poj 2784 Buy or Build(最小生成树)
最小生成树算法简单 只是增加了一些新的东西,对于需要最小生成树算法 和中 并检查使用的一系列 还有一些更深入的了解. 方法的一些复杂问题 #include<cstdio> #include ...
- UVa 1151 Buy or Build (最小生成树+二进制法暴力求解)
题意:给定n个点,你的任务是让它们都连通.你可以新建一些边,费用等于两点距离的平方(当然越小越好),另外还有几种“套餐”,可以购买,你购买的话,那么有些边就可以连接起来, 每个“套餐”,也是要花费的, ...
- UVa 1151 Buy or Build【最小生成树】
题意:给出n个点的坐标,现在需要让这n个点连通,可以直接在点与点之间连边,花费为两点之间欧几里得距离的平方,也可以选购套餐,套餐中所含的点是相互连通的 问最少的花费 首先想kruskal算法中,被加入 ...
- UVA - 1151 Buy or Build (买还是建)(并查集+二进制枚举子集)
题意:平面上有n个点(1<=n<=1000),你的任务是让所有n个点连通.可以新建边,费用等于两端点欧几里德距离的平方.也可以购买套餐(套餐中的点全部连通).问最小费用. 分析: 1.先将 ...
- UVA 1151 买还是建(最小生成树)
买还是建 紫书P358 [题目链接]买还是建 [题目类型]最小生成树 &题解: 这题真的心累,看了3天,最后照着码还是wa,先放lrj代码,以后再看吧 &代码: // UVa1151 ...
- UVA 1151二进制枚举子集 + 最小生成树
题意:平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此, 你可以新建一些边,费用等于两个端点的欧几里得距离的平方.另外还有q(0<=q<=8)个套餐(数 ...
随机推荐
- 1.25-1.26 Coordinator数据集和oozie bundle
一.Coordinator数据集 二.oozie bundle
- Python 之IO模型
阻塞IO模型:以前写的套接字通信都是阻塞型的.通过并发提高效率 非阻塞IO模型: from socket import * # 并不推荐使用,一是消耗cpu资源,二是会响应延迟 server = so ...
- <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs&qu ...
- hoj2188 WordStack
WordStack My Tags (Edit) Source : Mid-Atlantic 2005 Time limit : 5 sec Memory limit : 32 M S ...
- Codevs 1043 方格取数
1043 方格取数 2000年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Descri ...
- [Xcode 实际操作]九、实用进阶-(27)字符串文件(Localizable.strings)的本地化
目录:[Swift]Xcode实际操作 本文将演示字符串文件(Localizable.strings)的本地化. 在项目[DemoApp]文件夹下点击鼠标右键,弹出右键菜单 ->[New Fil ...
- hyperledger fabric 1.0.5 分布式部署 (五)
梳理fabric e2e_cli 测试程序的具体步骤 作者在 hyperledger fabric 1.0.5 分布式部署 (一)中给读者们介绍了如何从零开始部署一个测试的 demo 环境,如果细心的 ...
- bzoj1101:[POI2007]ZAP-Queries
[POI2007]ZAP-Queries 题意简述:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d. Solution 很显然这是一个莫比 ...
- docker+jenkins实现持续集成
持续集成的概念我就不多说了,网上一大堆,今日主要讲讲怎么通过docker 和jenkins实现项目的持续集成.看着简单,网上完整教程很少,本人摸索很久才搞定!!! 一.首先安装docker.安装过程可 ...
- c3p0连接池下载