题目链接: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(枚举 + 最小生成树)的更多相关文章

  1. hdu 2489 Minimal Ratio Tree

    http://acm.hdu.edu.cn/showproblem.php?pid=2489 这道题就是n个点中选择m个点形成一个生成树使得生成树的ratio最小.暴力枚举+最小生成树. #inclu ...

  2. Minimal Ratio Tree HDU - 2489

    Minimal Ratio Tree HDU - 2489 暴力枚举点,然后跑最小生成树得到这些点时的最小边权之和. 由于枚举的时候本来就是按照字典序的,不需要额外判. 错误原因:要求输出的结尾不能有 ...

  3. UVA1395 Slim Span(枚举最小生成树)

    题意: 求最小生成树中,最大的边减去最小的边 最小值. 看了题解发现真简单=_= 将每条边进行从小到大排序,然后从最小到大一次枚举最小生成树,当构成生成树的时候,更新最小值 #include < ...

  4. hdu Constructing Roads (最小生成树)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1102 /************************************************* ...

  5. HDU 2489 Minimal Ratio Tree(dfs枚举+最小生成树)

    想到枚举m个点,然后求最小生成树,ratio即为最小生成树的边权/总的点权.但是怎么枚举这m个点,实在不会.网上查了一下大牛们的解法,用dfs枚举,没想到dfs还有这么个作用. 参考链接:http:/ ...

  6. HDU 2489 Minimal Ratio Tree (DFS枚举+最小生成树Prim)

    Minimal Ratio Tree Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) ...

  7. hdu 2489 dfs枚举组合情况+最小生成树

    大家都说,搜索是算法的基础.今天最这题就有体会了.在n个顶点里选择m个顶点,求最小生成树.用到了深搜的回溯.所有情况都能枚举. #include<iostream> #include< ...

  8. hdu 2489 最小生成树状态压缩枚举

    思路: 直接状态压缩暴力枚举 #include<iostream> #include<algorithm> #include<cstdio> #include< ...

  9. HDU 2489 Minimal Ratio Tree (dfs+Prim最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2489 Problem Description For a tree, which nodes and ...

随机推荐

  1. Angular双向数据绑定MVVM以及基本模式分析

    MVVM: angular的MVVM实现的是双向数据绑定,模型从服务器端抓取到数据,将数据通过控制器(controller)传递到视图(view)显示,视图数据发生变化时同样也会影响到模型数据的变化, ...

  2. Python * 和 ** 参数问题

    Problem def calcuate(*keys) def calcluate(**keys) Slove *: 用来传递人一个无名字的参数,这些参数会以一个Tuple的形式来访问. **: 用来 ...

  3. List集合的迭代器方法

    1.后台JAVA代码的实现 //获取所有的支付方式的迭代器 // 获取支付方式 @RequestMapping(value = "get/payed/type", method = ...

  4. 战神Z7 D2安装黑苹果OS X El Capitan 10.11.2

    安装之初状态:两块硬盘,都是MBR格式分区,一块是机械硬盘,安装了WIN7 32位和Linux,一块是SSD,安装的是WIN7 64位与WIN10 64位以前玩过Mavericks,安装的就是在硬盘的 ...

  5. PHP Ajax 跨域问题最佳解决方案

    本文通过设置Access-Control-Allow-Origin来实现跨域. 例如:客户端的域名是client.runoob.com,而请求的域名是server.runoob.com. 如果直接使用 ...

  6. Dell服务器安装OpenManage(OMSA)

    公司上架了一批戴尔服务器,公司要求对这些服务器的硬件做一系列的监控,如CPU的温度,内存,风扇的状态,转速,磁盘等硬件的监控. 在对服务器的硬件监控上,目前业界主要基于如下两种: 1.服务器自带的工具 ...

  7. js实现文本框中内容的放大显示

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. yii2 codeception程序功能测试

    原文地址: http://www.360us.net/article/35.html http://blog.csdn.net/enoch612/article/details/48679069 ht ...

  9. Symbiont

    http://www.weiyangx.com/209230.html Symbiont,Credit Suisse与R3携手革新贷款数据验证环节Symbiont, Credit Suisse and ...

  10. 利用pg_stat_activity进行问题排查

    pg_stat_activity是一个非常有用的视图,可以帮助排查pg的一些问题(如连接数目过多问题).pg_stat_activity每行展示的是一个“process”的相关信息,这里的“proce ...