UVA 1151 - Buy or Build(最小生成树,二进制子集生成)

2023-12-05 02:09

本文主要是介绍UVA 1151 - Buy or Build(最小生成树,二进制子集生成),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

自己实力有限。 在为了K神之后。 自己才写出来的。  二进制子集生成 又忘记了。 又去 前面翻书看的。 (P 190)


这个题。  首先要去生成 最小生成树(也就是 不同套餐的情况)  


然后 用二进制子集生成。 枚举 所有套餐的选择情况。比如 套餐有 1 2 3  三种套餐 则 需要求出 所有可能的组合。 1 , 1 2, 1 3, 1 2 3,


这样 选择每一个子集 对于每一个子集 所形成的 联通分量用并查集保存。  在 子集之外。 肯定有一些点没有链接上。


那么下一步就是 用最小生成树 把 联通分量之外的点连上(因为这样连才能保证 连上的费用是最小的)


二进制枚举子集的方法


#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <cctype>
using namespace std;
#define ll long long
typedef unsigned long long ull;
#define maxn 2000000+10
#define INF 1<<30
int main (){
    //0 1 2 3 4  的子集生成for(int i = 0; i < (1 << 5) ; i++){for(int j = 0; j < 5; j++){if(i&(1 << j))printf("%d ",j);}printf("\n");}return 0;
}


代码中都有注释


#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <cctype>
using namespace std;
#define ll long long
typedef unsigned long long ull;
#define maxn 1000+10
#define INF 1<<30
struct po{int x,y;
};
struct point{int u, v;int cost;friend bool operator <(point a, point b){return a.cost < b.cost;}
};
po s[maxn];
int fa[maxn];    // 并查集父节点
vector <point> r;   // 所有的点到点的边的长度
vector <int> l;   //  这是最小生成树中的边。
vector <int> q[maxn]; // 保存的是 所有的套餐情况 其中q[i][0] 为这个套餐的费用 后面的都是套餐的点
int n,counts;   // n为点数  counts 为 套餐数
int find_fa(int x){return fa[x] == x ? x : fa[x] = find_fa(fa[x]);}
int init_fa(){for(int i = 0; i <= n; i++)fa[i] = i;
}
int line(int i,int j){return (s[i].x - s[j].x)*(s[i].x - s[j].x) + (s[i].y - s[j].y)*(s[i].y - s[j].y);
}
int solve(int s){init_fa();int cost = 0;int num = 0; // 边数for(int i = 0; i < counts; i++){   // 二进制子集生成 选择可能的套餐情况 收入并查集if(s&(1 << i)){cost += q[i][0];for(int j = 2; j < q[i].size() ; j++){int x = find_fa(q[i][j]);int y = find_fa(q[i][j-1]);if(x != y){fa[y] = x;num ++;}}}}for(int i = 0; num < n - 1; i++){ // 在所生成的子集中。 按照最小生成树 补边int l_ = l[i];int x = find_fa(r[l_].u);int y = find_fa(r[l_].v);int c = r[l_].cost;if(x != y){cost += c;num++;fa[x] = y;}}return cost;
}
int main (){int num;int b = 0;scanf("%d",&num);while(num--){if(b)printf("\n");b++;scanf("%d%d",&n,&counts);r.clear();l.clear();for(int i = 0; i <= counts; i++)q[i].clear();for(int i = 0; i < counts; i++){int x;scanf("%d",&x);int mo;for(int j = 0; j <= x; j++){scanf("%d",&mo);q[i].push_back(mo);  // q 第一项代表 费用。 后面代表点。}}for(int i = 1; i <= n; i++)scanf("%d%d",&s[i].x,&s[i].y);init_fa();for(int i = 1; i <= n-1; i++){for(int j = i+1; j <= n; j++){point pp;pp.u = i,pp.v = j,pp.cost = line(i,j);r.push_back(pp);// printf("%d %d %d\n",i,j,line(i,j));}}sort(r.begin(),r.end());int len = r.size();int minn = 0;for(int i = 0; i < len; i++){ // 并查集形成 最小生成树的 集合int uu = r[i].u;int vv = r[i].v;int x = find_fa(uu);int y = find_fa(vv);if(x != y){fa[x] = y;minn += r[i].cost;l.push_back(i); // 求出 最小生成树的边的集合}}int cost_min = minn;   //  没有套餐的时候for(int i = 1; i < (1 << counts); i++){  // 枚举选择 所有套餐的子集int minx = solve(i);cost_min = min(minx, cost_min);}printf("%d\n",cost_min);}return 0;
}




这篇关于UVA 1151 - Buy or Build(最小生成树,二进制子集生成)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/455728

相关文章

Maven pom.xml文件中build,plugin标签的使用小结

《Mavenpom.xml文件中build,plugin标签的使用小结》本文主要介绍了Mavenpom.xml文件中build,plugin标签的使用小结,文中通过示例代码介绍的非常详细,对大家的学... 目录<build> 标签Plugins插件<build> 标签<build> 标签是 pom.XML

nginx生成自签名SSL证书配置HTTPS的实现

《nginx生成自签名SSL证书配置HTTPS的实现》本文主要介绍在Nginx中生成自签名SSL证书并配置HTTPS,包括安装Nginx、创建证书、配置证书以及测试访问,具有一定的参考价值,感兴趣的可... 目录一、安装nginx二、创建证书三、配置证书并验证四、测试一、安装nginxnginx必须有"-

Java实战之利用POI生成Excel图表

《Java实战之利用POI生成Excel图表》ApachePOI是Java生态中处理Office文档的核心工具,这篇文章主要为大家详细介绍了如何在Excel中创建折线图,柱状图,饼图等常见图表,需要的... 目录一、环境配置与依赖管理二、数据源准备与工作表构建三、图表生成核心步骤1. 折线图(Line Ch

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

如何将二进制文件流转化为MockMultipartFile文件

《如何将二进制文件流转化为MockMultipartFile文件》文章主要介绍了如何使用Spring框架中的MockMultipartFile类来模拟文件上传,并处理上传逻辑,包括获取二进制文件流、创... 目录一、名词解释及业务解释1.具体业务流程2.转换对象解释1. MockMultipartFile2

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P