UVA 1151 Buy or Build (Kruskal+二进制枚举子集)

基于继电器与三极管的自动水泵控制器DIY:从电路原理到PCB制作实战 继电器作为一种利用电磁原理实现电路通断控制的电气开关,其核心价值在于通过小电流信号控制大电流负载,实现强弱电之间的安全隔离。在自动化控制领域,继电器常与三极管等半导体器件配合,构成驱动电路,将微弱的传感器信号放大,从而可靠地控制电机、水泵等执行机构。这种组合技术广泛应用于工业控制、智能家居及各类电子DIY项目中,例如实现水箱水位的自动检测与控制。本文将以一个典型的自动水泵控制器项目为例,深入剖析如何利用继电器与三极管搭建水位检测与驱动电路,并详细讲解从电路设计、PCB自制(热转印法)到系统调试的完整工程实践 阅读详情

问题 L: Buy or Build

时间限制: 20 Sec   内存限制: 128 MB
提交: 6   解决: 4
[ 提交][ 状态][ 讨论版]

题目描述

World Wide Networks (WWN) is a leading company that operates large telecommunication networks. WWN would like to setup a new network in Borduria, a nice country that recently managed to get rid of its military dictator Kurvi-Tasch and which is now seeking for investments of international companies (for a complete description of Borduria, have a look to the following Tintin albums ``King Ottokar's Sceptre", ``The Calculus Affair" and ``Tintin and the Picaros"). You are requested to help WWN todecide how to setup its network for a minimal total cost. 
Problem 
There are several local companies running small networks (called subnetworks in the following) that partially cover the n largest cities of Borduria. WWN would like to setup a network that connects all n cities. To achieve this, it can either build edges between cities from scratch or it can buy one or several subnetworks from local companies. You are requested to help WWN to decide how to setup its network for a minimal total cost. 

  • All n cities are located by their two-dimensional Cartesian coordinates. 
  • There are q existing subnetworks. If q>=1 then each subnetwork c ( 1<=c<=q ) is defined by a set of interconnected cities (the exact shape of a subnetwork is not relevant to our problem). 
  • A subnetwork c can be bought for a total cost wc and it cannot be split (i.e., the network cannot be fractioned). 
  • To connect two cities that are not connected through the subnetworks bought, WWN has to build an edge whose cost is exactly the square of the Euclidean distance between the cities.


You have to decide which existing networks you buy and which edges you setup so that the total cost is minimal. Note that the number of existing networks is always very small (typically smaller than 8). 
A 115 Cities Instance 
Consider a 115 cities instance of the problem with 4 subnetworks (the 4 first graphs in Figure 1). As mentioned earlier the exact shape of a subnetwork is not relevant still, to keep figures easy to read, we have assumed an arbitrary tree like structure for each subnetworks. The bottom network in Figure 1 corresponds to the solution in which the first and the third networks have been bought. Thin edges correspond to edges build from scratch while thick edges are those from one of the initial networks. 

输入

The first line contains the number n of cities in the country ( 1<=n<=1000 ) followed by the number q of existing subnetworks ( 0<=q<=8 ). Cities are identified by a unique integer value ranging from 1 to n . The first line is followed by q lines (one per subnetwork), all of them following the same pattern: The first integer is the number of cities in the subnetwork. The second integer is the the cost of the subnetwork (not greater than 2 x 106 ). The remaining integers on the line (as many as the number of cities in the subnetwork) are the identifiers of the cities in the subnetwork. The last part of the file contains n lines that provide the coordinates of the cities (city 1 on the first line, city 2 on the second one, etc). Each line is made of 2 integer values (ranging from 0 to 3000) corresponding to the integer coordinates of the city.

输出

Your program has to write the optimal total cost to interconnect all cities.

样例输入

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

样例输出

17

提示

Sample Explanation: The above instance is shown in Figure 2. An optimal solution is described in Figure 3 (thick edges come from an existing network while thin edges have been setup from scratch). 





Figure 3: An optimal solution of the 7 City instance in which which the first and second existing networkshave been bought while two extra edges (1, 5) and (2, 4) 


用二进制枚举每一种可能的情况
代码:

#include<bits/stdc++.h>
int n,q,cost[10],par[1002],rank1[1002],x[1002],y[1002],N;
using namespace std;
vector<int>g[10];
struct node
{
    int from,to,cost;
} rode[1000004];
bool cmp(node a,node b)
{
    return a.cost<b.cost;
}
void init()
{
    for(int i=0; i<=1000; i++)
        par[i]=i,rank1[i]=0;
}
int find(int x)
{
    if(x==par[x]) return x;
    return par[x]=find(par[x]);
}
bool same(int x,int y)
{
    return find(x)==find(y);
}
void unite(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y)return;
    if(rank1[x]<rank1[y])
        par[x]=y;
    else
    {
        par[y]=x;
        if(rank1[x]==rank1[y])
            rank1[x]++;
    }
}
int Kruskal()
{
    int ans=0;
    for(int i=0; i<N; i++)
    {
        node e=rode[i];
        if(!same(e.from,e.to))
        {
            ans+=e.cost;
            unite(e.from,e.to);
        }
    }
    return ans;
}
int meiju()
{
    init();
    int ans=Kruskal();
    int i,j;
    for(i=0; i<(1<<q); i++)
    {
        init();
        int ans2=0;
        for(j=0; j<q; j++)
        {
            if(i&(1<<j))
            {
                ans2+=cost[j];
                int L=g[j].size();
                for(int k=1; k<L; k++)
                {
                    unite(g[j][0],g[j][k]);
                }
            }
        }
        ans=min(ans,ans2+Kruskal());
    }
    return ans;
}
int main()
{
    while(~scanf("%d%d",&n,&q))
    {
        int i,j;N=0;
        for(i=0;i<q;i++)
        {
            int num;scanf("%d%d",&num,&cost[i]);
            for(j=0;j<num;j++)
            {
                int num1;scanf("%d",&num1);
                g[i].push_back(num1);
            }
        }
        for(i=1;i<=n;i++)
            scanf("%d%d",&x[i],&y[i]);
        for(i=1;i<=n;i++)
        {
            for(j=i+1;j<=n;j++)
            {
                rode[N].from=i;
                rode[N].to=j;
                rode[N++].cost=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
            }
        }
        sort(rode,rode+N,cmp);
        printf("%d\n",meiju());
        for(i=0;i<10;i++)g[i].clear();
    }
    return 0;
}


Python爬虫实战:使用最新技术抓取百度贴吧帖子内容 本文详细介绍了使用Python最新技术抓取百度贴吧帖子的完整流程。通过库,我们实现了高效的异步爬虫,具备JavaScript渲染、智能反爬应对、数据持久化等高级功能。这个爬虫框架具有良好的扩展性,可以根据具体需求进行功能增强。 阅读详情

相关推荐

2026零成本私有化:OpenClaw一键搭建Discord/Telegram智能机器人,数据不出本地,永久免费替代ChatGPT

如果内置的功能不能满足你的需求,你可以很容易地添加自己的自定义工具。public string Description => "查询指定城市的天气";// 调用天气API获取天气信息return $"city今天的天气是晴,温度25度";// 注册工具今天北京的天气怎么样?大模型的选择很重要:不要盲目追求大参数的模型。对于大多数场景来说,7B参数的模型已经足够用了,而且速度快,内存占用低。上下文长度不要设置太大:上下文长度越大,内存占用越高,推理速度越慢。

2601_94871597的博客 261

[最小生成树+二进制枚举]UVa1151 - Buy or Build

二进制枚举子集不太懂 用的还是例题的思路 #include using namespace std; const int maxn = 1005; struct point { int x,y; }pp[maxn]; struct edge{ int s,e,dist; }l[maxn*maxn]; int q,n,m; int p[maxn]; vector g[10]; i

Dosth_Magic 874

S32K344 Flash Driver实战:手把手教你实现任意字节写入与扇区解锁(含C40_Ip避坑指南)

本文深入解析S32K344微控制器的Flash驱动开发,重点解决C40_Ip驱动库的8字节对齐限制和扇区保护锁问题。通过实战案例和代码示例,详细介绍了如何实现任意字节写入、扇区解锁及性能优化策略,为Bootloader和OTA升级等应用提供可靠解决方案。

weixin_33713707的博客 432

UVa #1151 Buy or Build (例题11-3)

套餐只有8个,可以暴力枚举。不过边太多,不能枚举套餐都求一遍最小生成树。 其实只需要在一开始求出不包含套餐的最小生成树,把这些边记下来备用。之后枚举套餐的时候,先把套餐中的点全部加入并查集,然后在原最小生成树的基础上,再来求最小生成树就可以了。 那些一开始就没有被加入最小生成树的边,到了暴力枚举又加入很多权值为0的边排在他们前面,就更加不会被包含到最小生成树中了。

专攻挖掘机炒鸡蛋算法的专栏 977

别再只盯着GPS了!手把手教你用Python仿真UWB定位,30厘米精度是怎么算出来的?

本文详细解析了UWB(超宽带)室内定位技术的原理与实现,通过Python代码演示如何从三边测量法到实现30厘米精度的定位。文章涵盖了UWB的核心数学模型、Python仿真环境搭建、误差分析及优化策略,为开发者提供了实用的技术指南和应用场景。

weixin_26873711的博客 252

行列式详解:从定义到应用

本文系统介绍了行列式的核心概念和应用。首先从二阶、三阶行列式入手,逐步扩展到n阶行列式的定义,讲解了余子式和代数余子式的概念。其次,详细阐述了行列式的重要性质,包括转置不变性、行列交换变号等基本性质以及乘积性质等推论。在计算方法方面,介绍了按行展开法、化上三角矩阵法等实用技巧,并列举了特殊行列式的计算案例。最后重点讨论了行列式在克拉默法则、矩阵可逆性判断、几何体积计算及线性相关性判断等领域的应用。文章强调理解行列式的几何意义和灵活运用性质的重要性,并给出了学习建议和常见误区提示。行列式作为连接代数与几何的桥

aichitang2024的博客 3036

uva1151 Buy or Build

预处理+kruskal

YHaX的博客 575

VM下安装linux虚拟机(ubuntu)和Intel parallel XE 2013(ifort2013)

VM下安装ubuntu和ifort2013跑自己的模式 由于新冠疫情,本人只能在家工作,很多重要的文件和程序都留在了办公室的linux机器上,工作无法正常开展。本来准备去办公室把机器搬回家不曾想学校所有门禁都关闭,不许进入,何时解禁也没有明确日期。科研不能等人,没条件科研只能想办法创造条件了。 以前在自己的笔记本(windows)上装过一次VM和ifort但无奈程序不能正常跑,所以之前就放弃了。本...

pangdahai3366的博客 1498

UVA 1151 Buy or Build

#include&lt;bits/stdc++.h&gt; using namespace std; const int M=1e6+5; struct node{ int xx,yy,zz; }f[M],r[M],w[M]; int n,m,l,len; int x[M],y[M],fat[M],num[M],cost[M],a[1010][1010]; int cmp(node q,node...

Napoleon2004的博客 233

Arxml文件可视化:当汽车软件架构遇见交互式设计工具

本文探讨了Arxml文件在汽车电子系统开发中的可视化技术,结合AUTOSAR架构标准,介绍了如何利用现代Web技术构建交互式设计工具。通过三维组件关系图、动态数据流展示和版本对比等功能,显著提升开发效率和架构评审质量,适用于MBD和ASPICE开发流程。

weixin_29050271的博客 428

ComfyUI 的 LoRA 训练:秋叶 LoRA-scripts 参数设置与测试方法详解

秋叶 LoRA-scripts 的参数设置需结合理论(如模型原理、优化器机制)和硬件条件(显存、算力),新手可先按推荐值起步,再逐步调整。测试时,loss 值帮你判断训练是否正常,XYZ 图表法帮你找到最佳使用参数。掌握这些知识,你就能避开 LoRA 训练的常见坑,从 “盲目调参” 变为 “精准训练”。

2301_78150483的博客 2402

UVA 1151 - Buy or Build 最小生成树

&#13; 链接:&#13; https://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;page=show_problem&amp;problem=3592&#13; 题意&amp;题解:&#13; 紫书P358&#13; 代码:&#13; &#13; 31 int n, m;...

花海 198

深度学习论文: AnomalyDINO: Boosting Patch-based Few-shot Anomaly Detection with DINOv2

通过将DINOv2模型适应到一次性和少量异常检测中,并专注于工业应用少量异常检测。实验表明,这种方法不仅与现有技术相匹敌,甚至可以在许多设置中超越它们。我们提出的仅视觉方法AnomalyDINO基于补丁相似性,能够实现图像级别的异常预测和像素级别的异常分割。该方法在方法论上很简单,无需训练,因此不需要任何额外的数据进行微调或元学习。

mingo_敏 1904

uva-1151-Buy or Build-二进制枚举子集,并查集,最小生成树,kruskal

A - Buy or Build Time Limit:3000MS    Memory Limit:0KB    64bit IO Format:%lld & %llu SubmitStatusPracticeUVA 1151 Appoint description: Description World Wide Networks (WWN) is a lead

qq_27295525的专栏 844

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Buy or Build UVA - 1151 Kruskal+枚举

Buy or Build UVA - 1151 Kruskal+枚举 题意: 大概意思是有 n 个点,现在有 q 个方案 ,第 i 个方案耗费为 ci ,使 Ni 个点联通 ,当然也可以直接使两点联通 ,现求最小生成树的代价。 两点直接联通的代价是欧几里得距离的平方;   由于0&lt;=q&lt;=8,所以我们考虑二进制枚举; 该位为1...

loooooog的博客 191

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Buy or Build 【UVA - 1151】【二进制枚举+Kruskal】

题目链接 很套路的一道题了。 题意:有N个点,P个套餐,选择套餐的话,我们提供Cnt个点,Cost的花费,可以让套餐中的所有的点全部链接上去。其他的点,链接两个点的价值为。 因为P很小,所以直接二进制枚举来做。生成树用Kruskal来,比较的方便。 注意PE。 #include <iostream> #include <cstdio> #incl...

既然弱小,就只顾变强就是了 192

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

题意:平面上有n个点(1<=n<=1000),你的任务是让所有n个点连通。可以新建边,费用等于两端点欧几里德距离的平方。也可以购买套餐(套餐中的点全部连通)。问最小费用。 分析: 1、先将不购买任何套餐的最小生成树的所有边(边数为cnt)存起来,目的是枚举套餐时不必再耗Kruskal算法的O(n2)复杂度,而是降低为O(cnt)。 2、二进制枚举套餐。 3、枚举套餐时...

Cherrychan2014的博客 299

UVA 1151 Buy or Build MST

题意:在平面上有n个点,要让所有n个点都连通,所以你要构造一些边来连通他们,连通的费用等于两个端点的欧几里得距离的平方。另外还有q个套餐,可以购买,如果你购买了第i个套餐,该套餐中的所有结点将变得相互连通,第i个套餐的花费为ci。求最小花费。 解决:在这里我们可以采取枚举所有可能 + K算法来得出答案,比如这里有三个套餐,我们利用二进制枚举 001 010 011 100 101 110 11

Ash.的博客 544

UVA1151[Buy or Build] 子集枚举+最小生成树

UVa1151 子集枚举 最小生成树

Venishel的博客 314

uva1151 Buy or Build (MST+二进制枚举)

题意: n个点,和n个点的坐标,需要求n个点的最小生成树, 但是有q个套餐,每个套餐有费用cost,购买套餐可以使得套餐内的点直接连通, 输出最小生成树的边权和 数据范围: n<=1e3 q<=8 思路: 因为q很小,所以一个方法是直接二进制枚举选取的套餐,最大也就28(256) 枚举选中的套餐,然后再跑kruskal把剩下的点连起来求边权和, 但是因为边有n*(n+1)/2个,最大5...

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 186

洛谷 题解 UVA1151 【买还是建 Buy or Build】

【题意】 平面上有\(n(n<=1000)\)个点,你的任务是让所有n个点联通。为此,你可以新建一些边,费用等于两个端点的欧几里得距离平方。另外还有\(q(q<=8)\)个套餐可以购买,如果你购买了第\(i\)个套餐,该套餐中的所有结点将变得相互连接。第\(i\)个套餐的花费为\(C_i\)。 【算法】 \(Kruskal\) 【分析】 最容易想到的算法是:先枚举购买哪些套餐,把套餐中...

weixin_33827590的博客 355

UVa1151&POJ2784--Buy or Build【kruskal+二进制枚举】

链接: UVa http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3592 POJ http://poj.org/problem?id=2784 题意:告诉你n个点的坐标,建立一颗最小生成树,不过有q个套餐,套餐是连通某些点,并有一定花费,求

阳光照耀圣西罗 1077

UVa 1151 Buy or Build--最小生成树+二进制选择

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3592 给你一个地图,地图上有nn个点,让你链接所有的点,求最小消费,其中有q(q≤8)q(q\le8)家公司,这些公司已经链接了某些点,你可以直接买他们的网络,当然也会有一个花费cc, 输入输

taotao 的大学墓志 792

买还是建buy or build,uva1151——最小生成树,Kruskal,枚举子集

平面上有n个点(1 kruskal: 先求一次原图的最小生成树,得到n-1条边,然后每次枚举完套餐后只考虑套餐中的边和这n-1条边,则枚举套餐之后再求最小生成树。 精髓:kruskal算法中,那些两端已经属于同一个连通分量的边不会再加到生成树里面。 那么买了套餐后,相当于一些边的权变为0,而对于不在套餐中的每条边e,排序在e之前的边一个也没少,反而可能多了一些权值为

fsdcyr 1034

Buy or Build UVA - 1151 买还是建 最小生成树+二进制枚举子集

题目链接 平面上有n个点(1≤n≤1000),你的任务是让所有n个点连通。为此,你可以新建一些边,费用等于两个端点的欧几里德距离。另外还有q(0≤q≤8)个“套餐”可以购买,如果你购买了第i个套餐,该套餐中的所有结点将变得相互连通。第i个套餐的花费为Ci。如图11-6所示,一共有3个套餐: 它的最优解是购买套餐1和套餐2,然后手动连接两条边,如图11-7所示。 【分析】 最容...

Nicolas的博客 585

UVA1151buy or build 最小生成树+子集枚举

思路:按照紫书上给的思路写的,先跑一边kruskal,把每个边存起来。枚举套餐,然后只用存起来的边跑kruskal。思路很明确和清晰。对我来说,问题在于怎么枚举子集。按照紫书的方法是二进制来枚举子集。

蒟蒻LQL的ACM征程 269
上一篇: URAL 1982 Electrification Plan (Prim or Kruskal)
下一篇: POJ 2831 Can We Build This One (Prim+找圈中最大边)
还是太年轻
博客等级 码龄9年 53粉丝 552原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值