#include <stdio.h>
#include <set>
#include <string.h>
#include <algorithm>
using namespace std; const int maxn = ;
const int inf = ;
double minans;
int vis[maxn];//记录选中的点
int mp[maxn][maxn], ans[maxn][maxn];
int min_road[maxn]; int Prim(int n)
{
int i, j, min_i, minm, sum = ;
int dis[maxn];
int vis[maxn];
for (i = ; i <= n; i++)
dis[i] = ans[i][];
memset(vis, false, sizeof vis);
vis[] = true;
for (i = ; i<n; i++)
{
minm = inf, min_i = i;
for (j = ; j <= n; j++)
{
if (vis[j] == false && dis[j]<minm)
{
minm = dis[j];
min_i = j;
}
}
if (minm == inf)
break;
sum += minm;
vis[min_i] = true;
for (j = ; j <= n; j++)
{
if (vis[j] == && dis[j]>ans[min_i][j])
dis[j] = ans[min_i][j];
}
}
return sum;
} int ok(int n)
{
memset(vis, , sizeof vis);
int cnt = ;
int m = n, cont = ;
while (m)
{
if (m % )
vis[cont++] = cnt;
cnt++;
m /= ;
}
return cont;
} int main()
{
int d[maxn], maxm;
int n, i, j, k, cnt, m;
while (scanf("%d%d", &n, &m) != EOF)
{
if (n == && m == )
break;
maxm = ;
for (i = ; i <= n; i++)
maxm *= ;
for (i = ; i <= n; i++)
scanf("%d", &d[i]);
for (i = ; i <= n; i++)
{
for (j = ; j <= n; j++)
{
scanf("%d", &mp[i][j]);
}
}
minans = 9999999999.0;
int sum_point;
for (i = ; i < maxm; i++)
{
if (ok(i) == m + )
{
sum_point = ;
for (j = ; j <= m; j++)
{
sum_point += d[vis[j]];//选的点
for (k = j + ; k <= m; k++)
{
ans[j][k] = ans[k][j] = mp[vis[j]][vis[k]];
}
}
int sum = Prim(m);
if ((sum*1.0 / sum_point) < minans)
{
minans = sum*1.0 / sum_point;
for (i = ; i <= m; i++)
min_road[i] = vis[i];
}
}
}
for (i = ; i <= m - ; i++)
printf("%d ", min_road[i]);
printf("%d\n", min_road[i]);
}
return ;
}

hdu2489 Minimal Ratio Tree dfs枚举组合情况+最小生成树的更多相关文章

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

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

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

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

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

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

  4. hdu2489 Minimal Ratio Tree

    hdu2489 Minimal Ratio Tree 题意:一个 至多  n=15 的 完全图 ,求 含有 m 个节点的树 使 边权和 除 点权和 最小 题解:枚举 m 个 点 ,然后 求 最小生成树 ...

  5. HDU2489 Minimal Ratio Tree 【DFS】+【最小生成树Prim】

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

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

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

  7. HDU 2489 Minimal Ratio Tree 最小生成树+DFS

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

  8. HDU 2489 Minimal Ratio Tree(prim+DFS)

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

  9. HDU 2489 Minimal Ratio Tree(暴力+最小生成树)(2008 Asia Regional Beijing)

    Description For a tree, which nodes and edges are all weighted, the ratio of it is calculated accord ...

随机推荐

  1. 【源代码】LruCache源代码剖析

    上一篇分析了LinkedHashMap源代码,这个Map集合除了拥有HashMap的大部分特性之外.还拥有链表的特点,即能够保持遍历顺序与插入顺序一致. 另外.当我们将accessOrder设置为tr ...

  2. Facebook内部高效工作指南

    文章来源: TopDigital http://news.ittime.com.cn/usershow/main?userid=2826 [IT时代网.IT时代周刊编者按]每一个人工作中都会遇到力不从 ...

  3. JAVA运行时异常及常见的5中RuntimeExecption

    最近在抽时间看面试题,很多面试题都提出了写出java常见的5个运行时异常.现在来总结一下, java运行时异常是可能在java虚拟机正常工作时抛出的异常. java提供了两种异常机制.一种是运行时异常 ...

  4. Docker and Go: why did we decide to write Docker in Go?

    Docker and Go: why did we decide to write Docker in Go? | Hacker News https://news.ycombinator.com/i ...

  5. MIPS 指令集将在近期开源,RISC-V 阵营慌吗?

    消息称,MIPS 指令集即将开源. eetimes 17 日报导,Wave Computing 公司表示,在明年第一季度发布最新 MIPS 指令集体系和 MIPS 最新内核 R6 的时候将开源 MIP ...

  6. 包、修饰符、内部类、匿名内部类(java基础知识十)

    1.package关键字的概述及作用 * A:为什么要有包     * 将字节码(.class)进行分类存放  * B:包的概述     *   * C:包的作用     * 包名要定义在第一行,   ...

  7. jLim - 紧凑的 JavaScript 框架

    1. [代码][JavaScript]代码     /*! * jLim Core * * jLim is a small JavaScript base code. It can be used t ...

  8. java中匹配中文的正则表达式

    java中要匹配中文的正则表达式可以有两种写法:一是使用unicode中文码:二是直接使用汉字字符: 例: (1)String str = "晴"; String regexStr ...

  9. UISwitch用法:

    代码: #import "ViewController.h" @interface ViewController () @end @implementation ViewContr ...

  10. HihoCoder1084: 扩展KMP(二分+hash,求T串中S串的数量,可以失配一定次数)

    时间限制:4000ms 单点时限:4000ms 内存限制:256MB 描述 你知道KMP吗?它是用于判断一个字符串是否是另一个字符串的子串的算法.今天我们想去扩展它. 在信息理论中,在两个相同长度的字 ...