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

相关文章

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

python如何生成指定文件大小

《python如何生成指定文件大小》:本文主要介绍python如何生成指定文件大小的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python生成指定文件大小方法一(速度最快)方法二(中等速度)方法三(生成可读文本文件–较慢)方法四(使用内存映射高效生成

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

MybatisX快速生成增删改查的方法示例

《MybatisX快速生成增删改查的方法示例》MybatisX是基于IDEA的MyBatis/MyBatis-Plus开发插件,本文主要介绍了MybatisX快速生成增删改查的方法示例,文中通过示例代... 目录1 安装2 基本功能2.1 XML跳转2.2 代码生成2.2.1 生成.xml中的sql语句头2

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

SpringBoot实现二维码生成的详细步骤与完整代码

《SpringBoot实现二维码生成的详细步骤与完整代码》如今,二维码的应用场景非常广泛,从支付到信息分享,二维码都扮演着重要角色,SpringBoot是一个非常流行的Java基于Spring框架的微... 目录一、环境搭建二、创建 Spring Boot 项目三、引入二维码生成依赖四、编写二维码生成代码五

C语言中的常见进制转换详解(从二进制到十六进制)

《C语言中的常见进制转换详解(从二进制到十六进制)》进制转换是计算机编程中的一个常见任务,特别是在处理低级别的数据操作时,C语言作为一门底层编程语言,在进制转换方面提供了灵活的操作方式,今天,我们将深... 目录1、进制基础2、C语言中的进制转换2.1 从十进制转换为其他进制十进制转二进制十进制转八进制十进

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

PyQt5+Python-docx实现一键生成测试报告

《PyQt5+Python-docx实现一键生成测试报告》作为一名测试工程师,你是否经历过手动填写测试报告的痛苦,本文将用Python的PyQt5和python-docx库,打造一款测试报告一键生成工... 目录引言工具功能亮点工具设计思路1. 界面设计:PyQt5实现数据输入2. 文档生成:python-

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注