hdu2489-DFS+最小生成树
题意:
给你n个点,和任意两点的距离,让你在这N个点中找到一个有m个点并且ratio最小的树.
ratio = sum(edge) / sum(node)
思路: N <= 15 直接DFS暴力枚举出 m个点,然后再这m个点中跑一边最小生成树,这m个点的sum(node) 可以直接加出来,而 sum(edge) 就是最小生数的值,然后求出ratio更新最小,记录答案.
#include<stdio.h> #include<string.h> #include<algorithm>#define N 20 #define inf 100000000; using namespace std;typedef struct {int a ,b ,c; }NODE;bool camp(NODE a ,NODE b) {return a.c < b.c; }NODE node[N*N]; int map[N][N] ,weight[N]; int ans_num[N] ,now[N] ,n ,nn; int mer[N]; double now_min;int finds(int x) {if(x == mer[x]) return x;return mer[x] = finds(mer[x]); }void DFS(int s ,int t) {if(t == n + 1){int tmp = 0 ,sum1 = 0 ,sum2 = 0 ,mm = 0;for(int i = 1 ;i <= n ;i ++){sum1 += weight[now[i]];for(int j = i + 1 ;j <= n ;j ++){node[++tmp].a = now[i];node[tmp].b = now[j];node[tmp].c = map[now[i]][now[j]];if(mm < now[i]) mm = now[i];if(mm < now[j]) mm = now[j];}}sort(node + 1 ,node + tmp + 1 ,camp);for(int i = 1 ;i <= mm ;i ++)mer[i] = i;mm = 0;for(int i = 1 ;i <= tmp ;i ++){int x = finds(node[i].a);int y = finds(node[i].b);if(x == y) continue; mer[x] = y;sum2 += node[i].c; if(++mm == n - 1) break;}//printf("%d %d %d %d\n" ,sum1 ,sum2 ,now[1] ,now[2]); double nowm = sum2 * 1.0 / sum1;if(nowm < now_min){now_min = nowm;for(int i = 1 ;i <= n ;i ++)ans_num[i] = now[i];}return ;}for(int i = s + 1 ;i <= nn ;i ++){now[t] = i;DFS(i ,t + 1);} }int main () {int i;while(scanf("%d %d" ,&nn ,&n) && n + nn){for(i = 1 ;i <= nn ;i ++)scanf("%d" ,&weight[i]);for(i = 1 ;i <= nn ;i ++)for(int j = 1 ;j <= nn ;j ++)scanf("%d" ,&map[i][j]);now_min = inf;DFS(0 ,1);for(i = 1 ;i < n ;i ++)printf("%d " ,ans_num[i]);printf("%d\n" ,ans_num[i]);}return 0; }
hdu2489-DFS+最小生成树相关推荐
- 2019.9.17最小生成树知识点回顾
POJ 1797 Heavy Transportation(最大生成树-Prim) 最大生成树,方法模仿最小生成树,每次选最大边进行操作,即可. HDU 5723 Abandoned country( ...
- 《数学之美》中的模型及启示总结
目录 初衷 文章编排 章节总结 第1章 文字和语言 vs 数字和信息 第2章 自然语言处理--从规律到统计 第3章 统计语言模型 第4章 谈谈中文分词 第5章 隐含马尔可夫模型 第6章 信息的度量和作 ...
- 数据结构易混点、易错点、题目(2)
数据结构易混点.易错点.题目(个人向) 已更新完整.若题目跟答案对不上,先看看答案是否是该题,如果不是只能建议百度一下或者花点时间在pdf上找一下答案,因为是后期整理了题目,如有麻烦,万分抱歉.(可惜 ...
- 高阶数据结构(1):并查集 与 图
"Head in the clouds" 一.并查集 (1)认识并查集? 在一些问题中需要将n个不同的元素划分成 一些不想交的集合. 开始时,每个元素自成一个单元素集合,然后按一定 ...
- bzoj 1016: [JSOI2008]最小生成树计数【dfs+克鲁斯卡尔】
有一个性质就是组成最小生成树总边权值的若干边权总是相等的 这意味着按边权排序后在权值相同的一段区间内的边能被选入最小生成树的条数是固定的 所以先随便求一个最小生成树,把每段的入选边数记录下来 然后对于 ...
- BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )
不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ----------------------- ...
- 03 优先搜索(dfs bfs)、最小生成树(笛卡尔 prime)、两点最短路径(迪杰斯特拉 Floyd)
#include<bits/stdc++.h> using namespace std; void bfs(){for(int i=1;i<=n;i++)v[i]=0;queue&l ...
- 2019.08.21【NOIP提高组】模拟 B 组 dfs、最小生成树+二分、dp+计算几何、floyed+dfs、spfa
文章目录 0 最小比例(ratio) 1 软件公司(company) 2 空间航行(warp) 3 摧 毁 巴士站(bus) 0 最小比例(ratio) 图中共有N个点的完全图,每条边都有权值,每个点 ...
- hdu 5483 Nux Walpurgis(最小生成树+dfs)
题目链接:hdu 5483 Nux Walpurgis 解题思路 先求一下最小生成树.然后枚举起点,遍历整棵树,维护树边能被替换的最小权值. 代码 #pragma comment(linker, &q ...
- hdu2489 Minimal Ratio Tree
hdu2489 Minimal Ratio Tree 题意:一个 至多 n=15 的 完全图 ,求 含有 m 个节点的树 使 边权和 除 点权和 最小 题解:枚举 m 个 点 ,然后 求 最小生成树 ...
最新文章
- linux修改文件名常用命令
- docker和虚拟机的区别_详解win7操作系统下安装部署Docker环境
- 动态反射——Load,LoadFrom和LoadFile
- API测试和自动化101:基本指南
- netframework 4.0内置处理JSON对象
- idea怎么导入jxl.jar库
- c语言双链表从右向左遍历,有没有大佬在的,我这双向链表怎么没办法遍历
- Activity工作流
- 校园网如何更改ip地址
- linux热迁移137error VMware vCenter Converter 问题小结
- C语言 实现99乘法口诀表
- 计算机网络基础 试题 doc,计算机网络基础知识试题.doc
- 社会责任·价值共创,中关村网络安全与信息化产业联盟对话网信企业家海泰方圆董事长姜海舟
- Python 环境安装系统教程——PyCharm
- Note For Linux By Jes(3)-Linux文件与目录管理
- 一个事物两个方面的对比举例_对比属于修辞手法吗
- Excel如何快速录入大写数字序列
- kernel 启动过程之三, start_kernel()函数 概叙!init/main.c
- Linux - 关于/opt文件夹的说明
- linux mp3 乱码,Linux下MP3的TAG乱码问题解决方法