博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2489 Minimal Ratio Tree
阅读量:4710 次
发布时间:2019-06-10

本文共 2598 字,大约阅读时间需要 8 分钟。

这题不会。还以为有什么方法能直接搞出来最小的ratio以及那些点,结果就是枚举,不过就算是枚举我也写不出来啊~

主要的思想就是dfs选择m个点,而且更重要的是 不是中途选够了m个点就怎么样怎么样,而是必须搞到最后一层,这样select的值才完备了,所以中间可以剪枝,比如如果选了m+1个点就可以直接return了,比如如果现在已选的加上接下来都选也达不到m也可以return了(这个没实现)。
而且这个dfs写法有讲究的是从1开始先选再不选,所以这样可以保证如果多个最小值,被赋给ans的肯定是字典序最小的。
所以到最后一层就有 Cmn 个结果,所以就挨个prim(部分点求mst)呗,看看谁更小。

#include 
#include
#include
#include
using namespace std;const int INF = 1e9;const int MAXN = 15 + 1;int N, M;int weight[MAXN];int g[MAXN][MAXN];bool select[MAXN];bool ans[MAXN];double opt;double prim() // 求部分点的最小生成树,反正题目是完全图,总能找到边{ int node_sum = 0; int edge_sum = 0; int d[MAXN]; bool vis[MAXN]; bool first = 0; for (int i = 1; i <= N; i++) { if (select[i]) { node_sum += weight[i]; d[i] = INF; vis[i] = 0; if (!first) { d[i] = 0; first = 1; } } } for (int i = 0; i < M; i++) { int mind = INF, u = -1; for (int j = 1; j <= N; j++) { if (select[j] && !vis[j] && d[j] < mind) { mind = d[j]; u = j; } } vis[u] = 1; edge_sum += mind; for (int j = 1; j <= N; j++) if (select[j] && !vis[j] && g[u][j] < d[j]) d[j] = g[u][j]; } return (double)edge_sum / (double)node_sum;}void dfs(int v, int num) // 从n个里面选m个,虽然 Cn(m) < 2^n ,但是2^n的写法简单,而且这里n就15{ if (num > M) return; // 剪枝 if (v == N + 1) // 必须逛到最后一层才能计算结果,即使在前面已经选择满了 { if (num == M) { double t = prim(); if (t < opt) { opt = t; memcpy(ans, select, sizeof ans); // 这两个数组长度一样 } } return; } select[v] = 1; // 这样的展开次序可以保证最终答案字典序最小 dfs(v + 1, num + 1); select[v] = 0; dfs(v + 1, num);}int main(){ for (; ~scanf("%d%d", &N, &M);) { if (!N) break; opt = INF; for (int i = 1; i <= N; i++) scanf("%d", &weight[i]); for (int i = 1; i <= N; i++) for (int j = 1; j <= N; j++) scanf("%d", &g[i][j]); dfs(1, 0); bool first = 0; for (int i = 1; i <= N; i++) { if (ans[i]) { if (first) printf(" "); printf("%d", i); first = 1; } } printf("\n"); } return 0;}

转载于:https://www.cnblogs.com/CrossingOver/p/10704886.html

你可能感兴趣的文章
Application windows are expected to have a root view controller at the end of application launch
查看>>
归并排序
查看>>
Deep RL Bootcamp Lecture 3: Deep Q-Networks
查看>>
Vue引入jQuery
查看>>
Intellij IDEA 像eclipse那样给maven添加依赖
查看>>
网页截图像素与实际像素不一致问题
查看>>
QT容器map的插入,修改,遍历
查看>>
递归算法--写实例----阶乘问题---整数划分问题
查看>>
hibernate分表保存日志
查看>>
Java实现文件上传
查看>>
【IBM-WALA】Step by Step : use WALA to generate System Dependency Graph PDF and Dot File (Mac)
查看>>
[AHOI2005] SHUFFLE 洗牌
查看>>
拆迁管理系统--分割字符串的函数
查看>>
ZOJ1360 POJ1328 Radar Installation, 贪心
查看>>
poj1191 棋盘分割。 dp
查看>>
Python函数
查看>>
C++实现网格水印之调试笔记(五)—— 提取出错
查看>>
SpringMVC导出Excel
查看>>
【剑指offer】Q17:合并两个排序的链表
查看>>
JAVA学习(五):Java面向对象编程基础
查看>>