题目链接: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. ionic ios 友盟多渠道/自动签名/加固之腾讯云。乐固

    之前写了一篇文章主要是介绍使用gradle进行多渠道分发处理的文章--链接:http://www.cnblogs.com/happen-/p/6029387.html 最近在做app上线的处理,发现某 ...

  2. JS-面向对象

    话说,再次看完这个实例后的我,开始怀疑面向对象和JSON的区别...并开始怀疑这是面向对象的真实性 <!DOCTYPE html> <html> <head> &l ...

  3. java 部分注解说明(待补充)

    内容 所代表的意思 @RequestMapping(params = "save") @ResponseBody 将内容或对象作为http响应正文返回,并调用适合HttpMessa ...

  4. Google Map API V3开发(2)

    Google Map API V3开发(1) Google Map API V3开发(2) Google Map API V3开发(3) Google Map API V3开发(4) Google M ...

  5. Fedora 23安装 NS2 (network simulator 2)

    1 实验环境 OS: Fedora 23 workstation 2 实验步骤 ( 参考了:http://www.isi.edu/nsnam/ns/ns-build.html) 本次实验的实验环境: ...

  6. Mac OSX定位命令路径的方法

    可以使用which命令来定位一个命令. http://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/

  7. [译]git log进阶

    格式化log输出 oneline --oneline标记将每个commit压缩成一行. 默认情况下显示一个commit ID和commit描述的第一行. 输出如下: 0e25143 Merge bra ...

  8. Unity里的Mesh属性

    ----------------------------------------------------------------------------------------------- Mesh ...

  9. AndroidStudio使用笔记

    声明: 正式放弃Eclipse,投奔AndoidStudio大军,有些东西要从头摸索,特发此帖记录Android Studio的使用方法.本帖永久更新,不定时记录本人使用过程中的经验积累,给自己留一份 ...

  10. Excel 实用技巧之一

    1.在单元格内换行: Alt+Enter 2.合并其他单元格文字并换行: A1&char(10)&B1 3.Excel计算样本估算总体方差:STDEV/STDEVA(),分母为n-1. ...