hdu 2489(枚举 + 最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2489
思路:由于N, M的范围比较少,直接枚举所有的可能情况,然后求MST判断即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std; const int MAX_N = 17;
const double eps = 1e-10;
struct Edge {
int u, v, w;
Edge() {}
Edge(int _u, int _v, int _w) : u(_u), v(_v), w(_w) {}
} edge[MAX_N * MAX_N]; int cmp(const Edge &e1, const Edge &e2)
{
return e1.w < e2.w;
} int N, M, cnt, weight[MAX_N], g[MAX_N][MAX_N];
int parent[MAX_N];
void Init()
{
for (int i = 0; i < N; ++i) parent[i] = i;
} int find(int x)
{
if (x == parent[x]) return x; return parent[x] = find(parent[x]);
} void Union(int u, int v)
{
int r1 = find(u), r2 = find(v);
if (r1 == r2) return; parent[r1] = r2;
} double res;
vector<int > tmp, ans;
bool vis[MAX_N];
void gao(int state)
{
tmp.clear();
memset(vis, false, sizeof(vis));
int a = 0, b = 0;
for (int i = 0; i < N; ++i) {
if ((1 << i) & state) tmp.push_back(i), b += weight[i], vis[i] = true;
} Init();
for (int i = 0; i < cnt; ++i) {
Edge e = edge[i];
if (vis[e.u] && vis[e.v]) {
if (find(e.u) != find(e.v)) {
Union(e.u, e.v);
a += e.w;
}
}
} if (res < eps) {
res = a * 1.0 / b;
ans = tmp;
} else if (a * 1.0 / b + eps < res) {
res = a * 1.0 / b;
ans = tmp;
} else if (fabs(a * 1.0 / b - res) < eps) {
bool tag = false;
for (int i = 0; i < (int)ans.size(); ++i) {
if (ans[i] > tmp[i]) { tag = true; break; }
} if (tag) ans = tmp;
} } int main()
{
while (~scanf("%d %d", &N, &M)) {
if (N == 0 && M == 0) break; for (int i = 0; i < N; ++i) scanf("%d", &weight[i]);
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) scanf("%d", &g[i][j]);
} cnt = 0;
for (int i = 0; i < N; ++i) {
for (int j = i + 1; j < N; ++j) edge[cnt++] = Edge(i, j, g[i][j]);
} sort(edge, edge + cnt, cmp);
res = 0.0;
ans.clear();
for (int s = 0; s < (1 << N); ++s) {
int x = s, n = 0;
while (x) {
++n;
x &= (x - 1);
} if (n == M) {
gao(s);
}
} for (int i = 0; i < (int)ans.size(); ++i) {
printf(i == 0 ? "%d" : " %d", ans[i] + 1);
}
puts(""); }
return 0;
}
hdu 2489(枚举 + 最小生成树)的更多相关文章
- hdu 2489 Minimal Ratio Tree
http://acm.hdu.edu.cn/showproblem.php?pid=2489 这道题就是n个点中选择m个点形成一个生成树使得生成树的ratio最小.暴力枚举+最小生成树. #inclu ...
- Minimal Ratio Tree HDU - 2489
Minimal Ratio Tree HDU - 2489 暴力枚举点,然后跑最小生成树得到这些点时的最小边权之和. 由于枚举的时候本来就是按照字典序的,不需要额外判. 错误原因:要求输出的结尾不能有 ...
- UVA1395 Slim Span(枚举最小生成树)
题意: 求最小生成树中,最大的边减去最小的边 最小值. 看了题解发现真简单=_= 将每条边进行从小到大排序,然后从最小到大一次枚举最小生成树,当构成生成树的时候,更新最小值 #include < ...
- hdu Constructing Roads (最小生成树)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1102 /************************************************* ...
- HDU 2489 Minimal Ratio Tree(dfs枚举+最小生成树)
想到枚举m个点,然后求最小生成树,ratio即为最小生成树的边权/总的点权.但是怎么枚举这m个点,实在不会.网上查了一下大牛们的解法,用dfs枚举,没想到dfs还有这么个作用. 参考链接:http:/ ...
- HDU 2489 Minimal Ratio Tree (DFS枚举+最小生成树Prim)
Minimal Ratio Tree Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) ...
- hdu 2489 dfs枚举组合情况+最小生成树
大家都说,搜索是算法的基础.今天最这题就有体会了.在n个顶点里选择m个顶点,求最小生成树.用到了深搜的回溯.所有情况都能枚举. #include<iostream> #include< ...
- hdu 2489 最小生成树状态压缩枚举
思路: 直接状态压缩暴力枚举 #include<iostream> #include<algorithm> #include<cstdio> #include< ...
- HDU 2489 Minimal Ratio Tree (dfs+Prim最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2489 Problem Description For a tree, which nodes and ...
随机推荐
- 微信JS接口
微信JS接口 分享到朋友圈 分享给朋友 分享到QQ 拍照或从手机相册中选图 识别音频并返回识别结果 使用微信内置地图查看位置来源:http://www.cnblogs.com/txw1958/p/ ...
- [Think In Java]基础拾遗3 - 容器、I/O、NIO、序列化
目录 第十一章 持有对象第十七章 容器深入研究第十八章 Java I/O系统 第十一章 持有对象 1. java容器概览 java容器的两种主要类型(它们之间的主要区别在于容器中每个“槽”保存的元素个 ...
- Java基础-重写方法
一般我们需要在新类上重写,两个类的实现: class Animal{ public void move(){ System.out.println("动物可以移动"); } } c ...
- Problems about trees
Problems (1) 给一棵带边权的树,求遍历这棵树(每个节点至少经过一次)再回到起点的最短路程. 答案是显然的:边权之和的两倍. (2)给一棵带边权的树,求遍历这棵树(每个节点至少经过一次)的最 ...
- 【Beta】第5.5次任务发布
PM #100 日常管理&dev版宣传&设计报告管理后台. 后端 #101 完成收藏功能 完成管理员权限表的生成和接入(按位压缩权限表) 验收条件:收藏功能能够正常使用.能够区分常规用 ...
- 迅雷9、迅雷极速版之迅雷P2P加速:流量吸血鬼?为什么你装了迅雷之后电脑会感觉很卡很卡?
原文地址:http://www.whosmall.com/post/90 关闭极速版迅雷ThunderPlatform.exe进程 ThunderPlatform.exe目的:利用P2P技术进行用户间 ...
- git学习之旅
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743256916071d ...
- oracle merge into用法
转载:http://blog.163.com/duanpeng3@126/blog/static/885437352011724104741817/ 在 平时更新数据时,经常有这样一种更新,即将目标表 ...
- Chrome 及其 插件“个性化设置”备份
Chrome版本发布时间表 2016.10.13 v54.0.2840.59 主题颜色由 蓝色 变为 灰色 2016.11.17 重新使用 Chrome 浏览器(v54.0.2840.99),并设置 ...
- saltstack-部署
安装epel源(所有主机安装) [root@salt-server /]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/r ...