题目链接: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. Jquery跨域访问java接口

    Jquery前台代码: <script> $.getJSON("http://跨域URL/Example/text.do?jsonpCallback=?", funct ...

  2. webpackJsonp is not defined?

    用了CommonsChunkPlugin生成了公共文件,但是页面还没有引用这个公共文件 比如下面这个配置 var webpack = require('webpack'); var path = re ...

  3. Solr学习总结(四)Solr查询参数

    今天还是不会涉及到.Net和数据库操作,主要还是总结Solr 的查询参数,还是那句话,只有先明白了solr的基础内容和查询语法,后续学习solr 的C#和数据库操作,都是水到渠成的事.这里先列出sol ...

  4. MYSQL入门全套(第三部)

    MYSQL入门全套(第一部) MYSQL入门全套(第二部) 索引简介 索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构.如果想按特定职员的姓来查找 ...

  5. 大熊君大话NodeJS之 ------ Connect中间件第二季(源码分析)

    一,开篇分析 大家好,大熊君又回来了,今天这篇文章主要是对"Connect"中间件以及相关辅助中间件,做一个源码分析系列,我想上一篇文章大家也看了, 介绍了使用方式及用途,而这篇也 ...

  6. hadoop集群安装无密码登录

    http://blog.csdn.net/qiuchenl/article/details/7999044 hadoop安装:http://aperise.iteye.com/blog/2245547 ...

  7. Programming with Objective-C ----------Encapsulating Data

    Most Properties Are Backed by Instance Variables By default, a readwrite property will be backed by ...

  8. 微信安卓版下载 Android微信各版本列表

    前面ytkah弄了一个iso微信各版本列表,现在就来整一个微信 for Android各版本列表,方便大伙下载.每个版本都放出一些新的功能或修复相关错误,详情可以点击下面的版本链接进行查看.资源收集于 ...

  9. 如何取消 DiscuzX 帖子被系统自动隐?

    设置路径: 全局 -> 站点功能 -> 帖子阅读 -> 启用隐藏水帖,选择“否”

  10. js简单弹出层、遮罩层

    <html> <head> <title>js简单弹出层</title> <style> /*阴影边框效果*/ .box-shadow-1 ...