[HDU - 2489]Minimal Ratio Tree
时间:2019-08-20
本文章向大家介绍[HDU - 2489]Minimal Ratio Tree,主要包括[HDU - 2489]Minimal Ratio Tree使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意:输入n个点,要求选m个点满足连接m个点的m-1条边权值和sum与点的权值和ans最小,即sum/ans最小,并输出所选的m个点,如果有多种情况就选第一个点最小的,如果第一个点也相同就选第二个点最小的........
分析:因为n<=15,所以可以暴力枚举出所选的m个点,然后对这m个点进行最小生成树求得m-1条边的最小和,然后求sum/ans即可
#include <cstdio> #include <cstring> #define maxn 15 + 5 #define inf 0x3f3f3f3f int graph[maxn][maxn], vex[maxn]; int n, m, store[maxn], vis[maxn]; double ans; bool visted[maxn]; double prim() { int minid, cnt = 0, mcost, n_vex = 0, n_edge = 0; for (int i = 1; i <= m; ++i) n_vex += vex[vis[i]]; memset(visted, 0, sizeof(visted)); visted[1] = 1; while (cnt < m - 1) { mcost = inf; for (int i = 1; i <= m; ++i) { if (!visted[i]) continue; for (int j = 1; j <= m; ++j) if (!visted[j] && graph[vis[i]][vis[j]] < mcost) { mcost = graph[vis[i]][vis[j]]; minid = j; } } if (mcost != inf) { visted[minid] = 1; n_edge += mcost; ++cnt; } } return n_edge * 1.0 / n_vex; } void dfs(int k, int id) { if(id > m){ double mcost = prim(); if(mcost - ans < -(1e-8)) //!!!! { ans = mcost; memcpy(store, vis, sizeof(vis)); } return; } for (int i = k; i <= n; ++i) { vis[id] = i; dfs(i + 1, id + 1); } } int main() { while (~scanf("%d %d", &n, &m) && (n || m)) { for (int i = 1; i <= n; ++i) scanf("%d", &vex[i]); for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) scanf("%d", &graph[i][j]); ans = inf; dfs(1, 1); for (int i = 1; i <= m; ++i) if (i != m) printf("%d ", store[i]); else printf("%d\n", store[i]); } return 0; }
原文地址:https://www.cnblogs.com/Vikyanite/p/11385582.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浙大版《C语言程序设计(第3版)》题目集 习题9-1 时间换算
- 浙大版《C语言程序设计(第3版)》题目集 习题9-3 平面向量加法
- 浙大版《C语言程序设计(第3版)》题目集 习题9-4 查找书籍
- 浙大版《C语言程序设计(第3版)》题目集 习题9-5 通讯录排序
- 浙大版《C语言程序设计(第3版)》题目集 习题7-5 找鞍点
- 浙大版《C语言程序设计(第3版)》题目集 练习5-1 求m到n之和
- 手把手教你用Python爬取快递100查询你的物流信息
- 浙大版《C语言程序设计(第3版)》题目集 练习5-2 找两个数中最大者
- 浙大版《C语言程序设计(第3版)》题目集 练习5-3 数字金字塔
- 浙大版《C语言程序设计(第3版)》题目集 习题5-1 符号函数
- 浙大版《C语言程序设计(第3版)》题目集 习题5-2 使用函数求奇数和
- 浙大版《C语言程序设计(第3版)》题目集 习题5-3 使用函数计算两点间的距离
- 浙大版《C语言程序设计(第3版)》题目集 习题5-4 使用函数求素数和
- Linux进程之如何查看进程详情?
- 浙大版《C语言程序设计(第3版)》题目集 习题5-5 使用函数统计指定数字的个数