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

相关文章

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

C/C++随机数生成的五种方法

《C/C++随机数生成的五种方法》C++作为一种古老的编程语言,其随机数生成的方法已经经历了多次的变革,早期的C++版本使用的是rand()函数和RAND_MAX常量,这种方法虽然简单,但并不总是提供... 目录C/C++ 随机数生成方法1. 使用 rand() 和 srand()2. 使用 <random

Flask 验证码自动生成的实现示例

《Flask验证码自动生成的实现示例》本文主要介绍了Flask验证码自动生成的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 目录生成图片以及结果处理验证码蓝图html页面展示想必验证码大家都有所了解,但是可以自己定义图片验证码

Python如何在Word中生成多种不同类型的图表

《Python如何在Word中生成多种不同类型的图表》Word文档中插入图表不仅能直观呈现数据,还能提升文档的可读性和专业性,本文将介绍如何使用Python在Word文档中创建和自定义各种图表,需要的... 目录在Word中创建柱形图在Word中创建条形图在Word中创建折线图在Word中创建饼图在Word

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

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