https://vjudge.net/problem/UVA-1151

题意,给出N个点以及二维坐标,可以在任意两点间建立通路,代价是两点欧几里得距离的平方,同时有q个套餐,套餐x有qx个点,代价是qw,

花费qw就能将这qx个点全部相联通,套餐可以任意选择几种或不选,求将所有的点联通所要的最小代价。

很容易想到一个暴力做法,遍历2^q种套餐方案,将这些点提前加入后再跑kruskal,这样的复杂度有些高了。

其实简单证明一下,我们可以先不买套餐跑一遍kruskal,之后保存下来所选的边。

遍历所有q集合时发现,对于之前没有选到的边,现在加入了几条免费边之后,更不会选到(因为仅凭之前选的边就足以使得这条边无贡献),因为这条边加入后没有贡献,不会因为买套餐而变得有贡献,我们可以提前除去这些边,然后数据就很小了。

 #include<bits/stdc++.h>
using namespace std;
int f[];
int getf(int v){return f[v]==v?v:f[v]=getf(f[v]);}
struct Edge
{
int u,v,w;
bool operator<(const Edge& x)const{
return w<x.w;
}
}e1[],e2[];
int x[],y[],cost[];
int main()
{
int T,N,Q,n,m,xx,i,s,j,k;
//freopen("in.txt","r",stdin);
cin>>T;
while(T--){vector<int> G[];
int m1=,m2=;
cin>>N>>Q;
for(i=;i<Q;++i){
cin>>n>>cost[i];
while(n--){
cin>>xx;
G[i].push_back(xx);
}
}
for(i=;i<=N;++i)
{
cin>>x[i]>>y[i];
for(j=;j<i;++j)
{
e1[m1].u=i;
e1[m1].v=j;
e1[m1++].w=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
}
}
for(i=;i<=N;++i) f[i]=i;
sort(e1,e1+m1);
int ans=;
s=;
for(i=;s<N-&&i<m1;++i)
{
int fu=getf(e1[i].u),fv=getf(e1[i].v);
if(fv!=fu){
e2[m2++]=e1[i];
s++;
f[fv]=fu;
ans+=e1[i].w;
}
}
for(i=;i<(<<Q)-;++i)
{
for(j=;j<=N;++j) f[j]=j;
int sum=; s=;
for(j=;j<Q;++j)
{
if(i&(<<j)){
sum+=cost[j];
for(int k=;k<G[j].size()-;++k){
int fu=getf(G[j][k]),fv=getf(G[j][k+]);
if(fu!=fv){
f[fv]=fu;
s++;
}
}
}
}
for(j=;j<m2&&s<N-;j++)
{
int fu=getf(e2[j].u),fv=getf(e2[j].v);
if(fu!=fv){
s++;
f[fv]=fu;
sum+=e2[j].w;
}
}
ans=min(ans,sum);
}
cout<<ans<<endl;
if(T) cout<<endl; }
return ;
}

uva 1511 最小生成树的更多相关文章

  1. uva 1151最小生成树

    先求一次最小生成树,可以排除n*(n*1)/2-(n-1)条边,每次利用二进制法枚举套餐的选择,套餐中的点直接处理,如果两个套餐有公共点直接合并,他们一定连通,然后枚举第一步最小生成树得到的n-1条边 ...

  2. UVA - 11354Bond最小生成树,LCA寻找近期公共祖先

    看懂题目意思.他的意思是求将全部的城市走一遍,危急度最小.而且给 你两个s,t后让你求在走的时候,从s到t过程中危急度最大的值,并输出它, 然后就是怎样攻克了,这个题目能够说简单,也能够说难 通过思考 ...

  3. UVa 1395 (最小生成树) Slim Span

    题意: 规定一棵生成树的苗条度为:最大权值与最小权值之差.给出一个n个顶点m条边的图,求苗条度最小的生成树. 分析: 按照边的权值排序,枚举边集的连续区间[L, R]的左边界L,如果这些区间刚好满足一 ...

  4. D5 LCA 最近公共祖先

    第一题: POJ 1330 Nearest Common Ancestors POJ 1330 这个题可不是以1为根节点,不看题就会一直wa呀: 加一个找根节点的措施: #include<alg ...

  5. Root :: AOAPC I: Beginning Algorithm Contests (Rujia Liu) Volume 7. Graph Algorithms and Implementation Techniques

    uva 10803 计算从任何一个点到图中的另一个点经历的途中必须每隔10千米 都必须有一个点然后就这样 floy 及解决了 ************************************* ...

  6. 【UVA 10307 Killing Aliens in Borg Maze】最小生成树, kruscal, bfs

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20846 POJ 3026是同样的题,但是内存要求比较严格,并是没有 ...

  7. POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / SCU 1132 Invitation Cards / ZOJ 2008 Invitation Cards / HDU 1535 (图论,最短路径)

    POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / ...

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

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

  9. 训练指南 UVA - 11354(最小生成树 + 倍增LCA)

    layout: post title: 训练指南 UVA - 11354(最小生成树 + 倍增LCA) author: "luowentaoaa" catalog: true ma ...

随机推荐

  1. Acheron一期SVN地址

    svn://10.0.0.100/project/Acheron/2.0/SourceCode tailf 命令 http://web2py.com/books/default/chapter/29/ ...

  2. bitmap位图法

    位图法定义 位图法就是bitmap的缩写,所谓bitmap,是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况.通常是用来判断某个数据存不存在的. 例如,要判断一千万个人的状态,每 ...

  3. python逆向工程:通过代码生成类图

    python逆向工程:通过代码生成类图 大致过程 现在有一个core包,里面有python的代码. 通过core包,生成python的类图,如下: 实施步骤: 1.首先安装graphviz,一个画图工 ...

  4. oracle入门(2)—— 使用图形工具navicat for oracle

    [本文介绍] 本文将介绍如何使用图形工具navicat for oracle连接本地数据库 以及远程访问 服务器数据库. [下载地址] http://www.navicat.com.cn/downlo ...

  5. 收藏一些好用的c语言数据结构

    14.redis内置的链表,非常好 adlist.c /* adlist.c - A generic doubly linked list implementation * * Copyright ( ...

  6. s5_day11作业

    # 1 文件内容如下,标题为:姓名,性别,年纪,薪资 # # egon male 18 3000 # alex male 38 30000 # wupeiqi female 28 20000 # yu ...

  7. $python正则表达式系列(3)——正则内置属性

    本文主要总结一下python正则的一些内置属性的用法. 1. 编译标志:flags 首先来看一下re.findall函数的函数原型: import re print('[Output]') print ...

  8. React setState更新数组中的某个元素Element item

    var items = this.state.items; items[i].status = 'doing'; this.setState({ items: items }); //this.sta ...

  9. Windows 下c获取文件目录

    由于要插数据库,构建sql语句,需要文件名,在网上找了半天,无奈都是Linux下的专用函数,伤心,,还有那个下载URL ,还木搞好,就要走啦,心焦哇 #include<iostream> ...

  10. 解决Webpack 安装sass时出现的错误

    webpack环境下,加载css需要 css-loader 和 style-loader. css-loader:使用类似@import和url(...)的方法实现 require的功能: style ...