UVA 1151 Buy or Build(最小生成树,Kruskal)

Latex下使用JabRef添加参考文献 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 Latex可以手动添加参考文献,但文献过多时,使用JabRef软件相对方便。 提示:以下是本篇文章正文内容,下面案例可供参考 一、JabRef安装 网址:http://www.jabref.org 打开网址后,点击“Download” 进入如下页面后,选择 portable (便携版,无需安装),下载后是一压缩包,打开即可使用。 二、使用 1.创建库 ... 阅读详情

UVA 1151 Buy or Build(最小生成树,Kruskal)

对于n(1<=n<=1000)个点,q(0<=q<=8)个套餐,如果直接建边并枚举套餐的话,每次Kruskal算法要处理的节点数就会高达O(n2)个,那么整个算法的时间复杂度就高达O(2q n2+n2logn2)。其中O(n2logn2)是排序的时间复杂度。

为了降低时间复杂度,可以先通过Kruskal算法在不选套餐的情况下生成最小生成树,那么剩下的边只有n-1个,那么后面只需要处理这n-1条边和套餐里的边,算法的效率有了大大的提高。时间复杂度为O(2q n+nlongn)。

有个可能的问题是,后续本来要选的边会不会通过预处理被忽略掉了?

答案是不会,Kruskal算法以边的权值作为排序依据,并且只选两个端点不属于一个连通分量的边。由于把套餐内边的权值设置为0,对于每一个不在套餐内的边,排在它前面的边只增不减。如果该边在预处理的时候被抹去,那么在后续中也会被抹去。

我一开始有个想法是,将一个套餐里的点设置为同一个代表元,这样Kruskal算法就会忽略以这些点为端点的边,但是问题是,一个点可能会出现在多个套餐里面,这样只能记录这个点所在的最后一个套餐里的代表元,那么会导致在先前的套餐里本来应是权值为0的边消失。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int max_n=1e6;
int x[1005],y[1005],p[1005];
int pre_u[max_n],pre_v[max_n],pre_r[max_n],u[5000],v[5000],r[5000];
int pre_w[max_n],w[5000];
int price[10];
vector<int> point[10];
int n,q;
int mcount;
int distance(int i,int j)
{
	int a=x[j]-x[i];
	int b=y[j]-y[i];
	return (a*a+b*b);
}
bool cmp_1(const int i,const int j)
{
	return pre_w[i]<pre_w[j];
}
bool cmp_2(const int i,const int j)
{
	return w[i]<w[j];
}
int find(int x)
{
	return p[x]==x?x:p[x]=find(p[x]);
}
long long kruskal(void)
{
	long long ans=0;
	for(int i=0;i<mcount;i++)r[i]=i;
	for(int i=1;i<=n;i++)p[i]=i;
	sort(r,r+mcount,cmp_2);
	for(int i=0;i<mcount;i++)
	{
		int e=r[i];
		int x=find(u[e]);
		int y=find(v[e]);
		if(x!=y){
			p[x]=y;
			ans+=w[e];
		}
	}
	return ans;
}
void solve(void)
{
	int cnt=0;
	mcount=0;
	long long ans=0;
	for(int i=1;i<=n;i++)
	for(int j=i+1;j<=n;j++)//建边 
	{
		pre_r[cnt]=cnt;
		pre_u[cnt]=i;
		pre_v[cnt]=j;
		pre_w[cnt++]=distance(i,j);
	}
	sort(pre_r,pre_r+cnt,cmp_1);
	for(int i=1;i<=n;i++)p[i]=i;
	for(int i=0;i<cnt;i++)
	{
		int e=pre_r[i];
		int x=find(pre_u[e]);
		int y=find(pre_v[e]);
		if(x!=y){
			p[x]=y;
			ans+=pre_w[e];
			u[mcount]=pre_u[e];
			v[mcount]=pre_v[e];
			w[mcount++]=pre_w[e];
		}
		if(mcount==n-1)break;
	}//筛选出n-1条边
	for(int i=1;i<(1<<q);i++)
	{
		mcount=n-1;
		long long cost=0;
		for(int j=0;j<q;j++)
		if(i&(1<<j)){
			for(int k=0;k<point[j].size()-1;k++)
			{
				u[mcount]=point[j][k];
				v[mcount]=point[j][k+1];
				w[mcount++]=0;
			}
			cost+=price[j];
		}
		long long temp=kruskal()+cost;
		if(temp<ans)ans=temp;
	}
	cout<<ans<<endl;
}
int main(void)
{
//	freopen("out.txt","w",stdout);
	int t;
	cin>>t;
	while(t--)
	{
		scanf("%d%d",&n,&q);
		for(int i=0;i<q;i++)
		point[i].clear();
		for(int i=0;i<q;i++)
		{
			int a;
			scanf("%d%d",&a,&price[i]);
			while(a--)
			{
				int b;
				scanf("%d",&b); 
				point[i].push_back(b);
			}
		}
		for(int i=1;i<=n;i++)
		scanf("%d%d",&x[i],&y[i]);
		solve();
		if(t!=0)cout<<endl;
	}
//	fclose(stdout);
}
//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 
【数据集】waymo motion dataset介绍与数据解析可视化 waymo motion数据集下载,数据描述,数据特征和地图特征,数据解析并完成数据可视化 阅读详情

相关推荐

STM32H7+LAN8720A之ETH与LWIP配置问题(End)

开篇介绍 由于项目中需要使用到STM32H7系列的芯片,且该系列无法移植ST的标准库,只能使用ST的HAL库,通过STM32Cube生成HAL库的基本代码。在项目开发中需要使用到STM32板载的ETH口,在简化的四层模型中充当着数据链路层的角色,我们只需添加PHY并配置好IP,即可实现基本的TCP主从机通信、UDP通信等等。 一、激光雷达3i-T1 由于使用了一款只具有网口通信的单线激光雷达,其具有TCP和UDP方式的通信方式,为了避免进行TCP中的socket报文解析和繁琐的通信握手过程,我们首先将雷达配

weixin_42024702的博客 1万+

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

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

fsdcyr 1034

Frida三层次钩子快速逆向VMP+OLLVM加固APK

VMP(虚拟机保护)和OLLVM(控制流平坦化)是Android应用常见的双重混淆技术,其核心原理是将Java逻辑虚拟化、Native代码控制流打散,从而阻断传统静态分析与简单Hook。但任何混淆都必须在CPU上执行,因此必然暴露JNI注册行为、ABI参数传递规律及系统调用痕迹。基于此,Frida可通过跨层联动——从JNI_OnLoad捕获Native库加载、在VMP解释器入口截获字节码上下文、于关键系统调用(如read/gettimeofday)反向追踪数据流——构建可观测、可复现的动态分析链。该方法无需

weixin_30888413的博客 1001

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

从Transformer到Mamba:显著性检测领域的计算效率革命(Samba框架深度解析)

本文深入解析了Samba框架在显著性目标检测(Salient Object Detection)领域的创新应用,通过结合Mamba架构的优势,实现了计算效率的革命性提升。Samba框架采用显著性引导的Mamba模块(SGMB)和上下文感知上采样(CAU),有效解决了传统CNN和Transformer的局限性,同时在RGB-D等多模态任务中展现出卓越性能。

mmm90的博客 557

Cadence 设计实践笔记-小哥allegro 2层板笔记

规范建立文件夹本章节主要跟着B站PCB入门首选视频-小哥Cadence Allegro 2层板视频,结合自己的实践一步步完成一个完整的PCB板的设计。规范建立文件夹建立八个文件夹我使用的Cadence 17.4 有些差异原理图绘制原图绘制首先要熟悉原理图工作原理工作原理下面是这个项目的原理图重点关注电源新建原理图库打开Cadence 软件创建项目新建工程 File ==========》Project我这里选择了Enable PSPice 试试能不能仿真,新建项目如下。

我的专栏 1479

uva 1151 买还是建 buy or build 最小生成树 Kruskal

#include &lt;cstdio&gt; #include &lt;algorithm&gt; #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;vector&gt; #define LL long long using namespace std; typedef struct edge{ int s; ...

GaoJieVery6 322

告别仿真报错!手把手教你为Intel MAX10 FPGA定制IBIS模型(附Allegro Skill工具)

本文详细介绍了为Intel MAX10 FPGA定制IBIS模型的完整流程,解决信号完整性仿真中的管脚映射问题。通过Allegro Skill工具自动化处理管脚信息,优化IBIS模型关键段落,提升仿真效率和精度,适用于高速数字电路设计。

weixin_33217202的博客 322

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

Unity ProBuilder(自己创建斜面、拐角)

ProBuilder基础实例

weixin_56537692的博客 1551

青岛鼎信Java开发面试题及参考答案(3万字长文,多张原理图)

MySQL 的事务特性有哪些? MySQL 事务具有四个重要特性,被称为 ACID 特性。 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么全部执行,要么全部不执行。例如,在银行转账场景中,从账户 A 转账到账户 B,包括扣减账户 A 的金额和增加账户 B 的金额这两个操作必须作为一个整体来完成。如果在执行过程中发生错误,比如系统崩溃或者数据库出现故障,那么已经执行的部分必须全部回滚,就好像整个转账操作从未发生过一样。 一致性(Consistency):事务必须

大模型大数据攻城狮的专栏 1088

UVA1151 买还是建 Buy or Build

买还是建 Buy or Build - 洛谷 第一道A掉的紫题。。(虽然比较水) 修修改改写了将近五六个小时,还是在紫书的帮助下写的。 不过正解想出来后也就很快A了,(除了忘了重置sum的值WA了一发) 题解: 这题其实相当于一个暴力,枚举每个套餐是否会被选到,q很小,最大为8。2^8也仅有256种情况 枚举完套餐,把这些套餐中包含的点加一个权值为0的边然后求最小生成树就行。 粗略分析一下时间复杂度: 先建立每个点之间的边,则有n*(n+1)/2条.

qq_34920482的博客 1587

【网络安全】浅谈数据库攻击复现及相关安全优化

4、准备数据库服务器为了安全正式环境应该把数据库单独放一台服务器,只允许让应用服务器 IP 来访问数据库服务器,通过独立两者,就算其中一台发生问题,另一台也是好的,进一步降低了危险性。5、定时备份数据库开发定时备份功能,可以使用 Crontab,或者其他框架,设定周期备份数据,哪怕是数据丢失或被删除也可以快速恢复。

2401_88545587的博客 221

UVA1151 Buy Or Build 解题报告

https://vjudge.net/problem/UVA-1151平面上有n个点(1≤n≤1000),你的任务是让所有n个点连通。为此,你可以新建一些边,费用等于两个端点的欧几里德距离。另外还有q(0≤q≤8)个“套餐”可以购买,如果你购买了第i个套餐,该套餐中的所有结点将变得相互连通。第i个套餐的花费为Ci。最容易想到的朴素办法是先枚举购买哪些套餐,把套餐中的边权值都设为0,然后再求最小生成树。枚举量为O(2q),给边排序的时间复杂度为O(n2logn),Kruskal算法过程是O(n2),因此总复杂

qq_45554473的博客 319

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

UVA 1151 Buy or Build MST

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

Ash.的博客 544

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Buy or Build UVA - 1151

问题 分析 可以暴力求解,枚举可以购买的套餐组合,然后再kruskal算法,其中将套餐的边提前连通,权重视为0,再连通剩下的边 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include &l...

zpf1998的博客 165

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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;...

花海 197

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

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

weixin_33827590的博客 355

UVa1151 Buy or Build

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

苦鬼·。 232

Buy or Build UVA - 1151(kruskal&&枚举)一个并查集的bug调了巨久。。。。。qwq

Buy or Build UVA - 1151 题意: 给你一个图。 要求: 建造一个生成树。 每两个点之间:建造一条边的花费是两点之间的欧几里德距离 现在有几个套餐,每个套餐可以 提供几个点, 有一个cost【i】。 思路: 先连边。(本题计算欧几里德距离时,不用开根号) 之后先算一次最小生成树。在计算的过程中,可以把 ...

qq_45377553的博客 222

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

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

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

aofan9566的博客 138

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

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

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

紫书 - UVA - 1151 Buy or Build 最小生成树+状态枚举

紫书 - UVA - 1151 Buy or Build 最小生成树+状态枚举 https://vjudge.net/problem/UVA-1151 题意:平面上有n个点,两点间的费用为两点的欧几里得距离。另外还有m个套餐,购买第i个套餐需要花费c[i],购买后套餐中的点均连通。 题解:先对原图求一次最小生成树,将原图的其他边都去掉,仅剩下这n-1条边。然后状态枚举[0,1<<m)进行购买套餐的操作,然后再求最小生成树即可。这种思路是正确的:用Kruskal算法求最小生成树时,就是每次优先选择最小的边,而

ACZone 320

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

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

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

dimaishu7553的博客 137
上一篇: UVA 12219 Common Subexpression Elimination
下一篇: UVA 658 It‘s not a Bug,it‘s a Feature(单源最短路,Dijkstra)
WedsonLin
博客等级 码龄7年 1粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值