POJ 3925 Minimal Ratio Tree(枚举+最小生成树)

2024-06-01 18:58

本文主要是介绍POJ 3925 Minimal Ratio Tree(枚举+最小生成树),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

POJ 3925 Minimal Ratio Tree

题目链接

题意:给定一些点权和一个边权矩阵,求一个最小的比例的树

思路:先枚举用哪些点,然后求最小生成树即可

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;const int N = 20;int n, m, val[N], edge[N][N];int bitcount(int x) {if (x == 0) return 0;return bitcount(x>>1) + (x&1);
}struct Edge {int u, v, w;Edge() {}Edge(int u, int v, int w) {this->u = u;this->v = v;this->w = w;}
} e[N * N];int en;bool cmp(Edge a, Edge b) {return a.w < b.w;
}int parent[N];int find(int x) {return x == parent[x] ? x : parent[x] = find(parent[x]);
}int cal() {sort(e, e + en, cmp);for (int i = 0; i < n; i++) parent[i] = i;int tot = n;int ans = 0;for (int i = 0; i < en; i++) {int pu = find(e[i].u);int pv = find(e[i].v);if (pu != pv) {parent[pu] = pv;ans += e[i].w;tot--;}if (tot == 1) break;}return ans;
}int main() {while (~scanf("%d%d", &n, &m) && n || m) {for (int i = 0; i < n; i++) scanf("%d", &val[i]);for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)scanf("%d", &edge[i][j]);int maxs = (1<<n);int anss;double ans = 1e15;for (int i = 1; i < maxs; i++) {if (bitcount(i) != m) continue;int sumnode = 0;en = 0;for (int u = 0; u < n; u++) {if (i&(1<<u)) {sumnode += val[u];for (int v = 0; v < n; v++) {if (edge[u][v] == 0) continue;if (i&(1<<v)) e[en++] = Edge(u, v, edge[u][v]);}}}double tmp = cal() * 1.0 / sumnode;if (ans > tmp) {ans = tmp;anss = i;}}int bo = 0;for (int i = 0; i < n; i++) {if (anss&(1<<i)) {if (bo) printf(" ");else bo = 1;printf("%d", i + 1);}}printf("\n");}return 0;
}


这篇关于POJ 3925 Minimal Ratio Tree(枚举+最小生成树)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

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

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

详解Java中如何使用JFreeChart生成甘特图

《详解Java中如何使用JFreeChart生成甘特图》甘特图是一种流行的项目管理工具,用于显示项目的进度和任务分配,在Java开发中,JFreeChart是一个强大的开源图表库,能够生成各种类型的图... 目录引言一、JFreeChart简介二、准备工作三、创建甘特图1. 定义数据集2. 创建甘特图3.

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma