#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. Android Studio代码自己主动检測错误提示

    Android Studio的代码自己主动检測的错误提示方式感觉有点奇葩.和Eclipse区别非常大,Eclipse检測到某个资源文件找不到或者错误,都会在Project中相应的文件前面打叉.可是An ...

  2. 使用$.when()解决AJAX异步难题之:多个ajax操作进行逻辑与(and)

    上一篇文章"JQuery.deferred提供的promise解决方式",提到了javascript异步操作的3个问题,以及javascript Promise入门.如今我们看下怎 ...

  3. vs2010 msvcr100.DLL 丢失!!! 用release 就可以了

  4. 关于用HOOK拦截键盘的一些问题

    因为MSDN上说要这样做,所以我就这样做的,读懂MSDN是关键,下面来仔细阅读一下MSDN,看它到底是怎样描述的.阅读的时候我先给出原文,再进行自己的一些翻译或描述. 先看回调函数KeyboardPr ...

  5. Android app身体质量指数(BMI)

    针对中国人的标准身高体重来測算,提示您身体的健康状况. 提示您是否应该锻炼.节食或者补充营养等.第一时间知道您的健康状况. 下载地址:http://android.myapp.com/myapp/de ...

  6. java的gradle项目的基本配置

    plugins { id 'org.springframework.boot' version '2.1.4.RELEASE' id 'java' } apply plugin: 'io.spring ...

  7. hadoop shuffle

    1 hadoop shuffle的地位 hadoop  shuffle是map reduce算法的核心,是它连接了多个map和多个reduce,它将map的输出交给reduce作为输入. 2 hado ...

  8. POJ3104 Drying —— 二分

    题目链接:http://poj.org/problem?id=3104 Drying Time Limit: 2000MS   Memory Limit: 65536K Total Submissio ...

  9. YTU 2429: C语言习题 学生成绩输入和输出

    2429: C语言习题 学生成绩输入和输出 时间限制: 1 Sec  内存限制: 128 MB 提交: 1897  解决: 812 题目描述 编写一个函数print,打印一个学生的成绩数组,该数组中有 ...

  10. MYSQL进阶学习笔记三:MySQL流程控制语句!(视频序号:进阶_7-10)

    知识点四:MySQL流程控制语句(7-10) 选择语句: (IF ELSE ELSE IF CASE 分支)IFNULL函数 IF语法: 语法规则: IF search_condition THEN ...