题意:

      给你n个点,和任意两点的距离,让你在这N个点中找到一个有m个点并且ratio最小的树.

                        ratio = sum(edge) / sum(node)

思路: N <= 15 直接DFS暴力枚举出 m个点,然后再这m个点中跑一边最小生成树,这m个点的sum(node) 可以直接加出来,而 sum(edge) 就是最小生数的值,然后求出ratio更新最小,记录答案. 


#include<stdio.h>
#include<string.h>
#include<algorithm> #define N 20
#define inf 100000000;

using namespace
std; typedef struct
{
int
a ,b ,c;
}
NODE; bool camp(NODE a ,NODE b)
{
return
a.c < b.c;
}
NODE node[N*N];
int
map[N][N] ,weight[N];
int
ans_num[N] ,now[N] ,n ,nn;
int
mer[N];
double
now_min; int finds(int x)
{
if(
x == mer[x]) return x;
return
mer[x] = finds(mer[x]);
} void
DFS(int s ,int t)
{
if(
t == n + 1)
{
int
tmp = 0 ,sum1 = 0 ,sum2 = 0 ,mm = 0;
for(int
i = 1 ;i <= n ;i ++)
{

sum1 += weight[now[i]];
for(int
j = i + 1 ;j <= n ;j ++)
{

node[++tmp].a = now[i];
node[tmp].b = now[j];
node[tmp].c = map[now[i]][now[j]];
if(
mm < now[i]) mm = now[i];
if(
mm < now[j]) mm = now[j];
}
}

sort(node + 1 ,node + tmp + 1 ,camp);
for(int
i = 1 ;i <= mm ;i ++)
mer[i] = i;
mm = 0;
for(int
i = 1 ;i <= tmp ;i ++)
{
int
x = finds(node[i].a);
int
y = finds(node[i].b);
if(
x == y) continue;
mer[x] = y;
sum2 += node[i].c;
if(++
mm == n - 1) break;
}

//printf("%d %d %d %d\n" ,sum1 ,sum2 ,now[1] ,now[2]);
double nowm = sum2 * 1.0 / sum1;
if(
nowm < now_min)
{

now_min = nowm;
for(int
i = 1 ;i <= n ;i ++)
ans_num[i] = now[i];
}
return ;
} for(int
i = s + 1 ;i <= nn ;i ++)
{

now[t] = i;
DFS(i ,t + 1);
}
} int main ()
{
int
i;
while(
scanf("%d %d" ,&nn ,&n) && n + nn)
{
for(
i = 1 ;i <= nn ;i ++)
scanf("%d" ,&weight[i]);
for(
i = 1 ;i <= nn ;i ++)
for(int
j = 1 ;j <= nn ;j ++)
scanf("%d" ,&map[i][j]);
now_min = inf;
DFS(0 ,1);
for(
i = 1 ;i < n ;i ++)
printf("%d " ,ans_num[i]);
printf("%d\n" ,ans_num[i]);
}
return
0;
}

       

hdu2489-DFS+最小生成树的更多相关文章

  1. 图的全部实现(邻接矩阵 邻接表 BFS DFS 最小生成树 最短路径等)

    1 /** 2 * C: Dijkstra算法获取最短路径(邻接矩阵) 3 * 6 */ 7 8 #include <stdio.h> 9 #include <stdlib.h> ...

  2. 【wikioi】1002 搭桥(dfs+最小生成树)

    http://wikioi.com/problem/1002/ 今天开始又开始刷水了哈T_T.照着hzwer神犇的刷题记录刷!!! 题解: 一开始我也不会,但是我想到了直接爆搜T_T. 好吧,题解. ...

  3. 【POJ 1639】 Picnic Planning (最小k度限制生成树)

    [题意] 有n个巨人要去Park聚会.巨人A和先到巨人B那里去,然后和巨人B一起去Park.B君是个土豪,他家的停车场很大,可以停很多车,但是Park的停车场是比较小.只能停k辆车.现在问你在这个限制 ...

  4. Code VS 1002 搭桥

    题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物.现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着矩形的方格的边沿搭建 ...

  5. 【牛客提高训练营5B】旅游

    题目 吉老师的题时过一年还是不会做 从\(1\)号点出发经过每条边至少一次并且还要回到\(1\)号点,这跟欧拉回路的条件非常像,但是欧拉回路的实际上是"经过每一条边恰好一次并且回到出发点&q ...

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

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

  7. hdu2489 Minimal Ratio Tree dfs枚举组合情况+最小生成树

    #include <stdio.h> #include <set> #include <string.h> #include <algorithm> u ...

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

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

  9. HDU 5723 Abandoned country (最小生成树 + dfs)

    Abandoned country 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5723 Description An abandoned coun ...

  10. HDU 5723 Abandoned country (最小生成树+dfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5723 n个村庄m条双向路,从中要选一些路重建使得村庄直接或间接相连且花费最少,这个问题就是很明显的求最 ...

随机推荐

  1. dubbo实战之一:准备和初体验

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  2. HDOJ-6666(简单题+模拟题)

    quailty and ccpc hdoj-6666 题目很简单,按照题目的意思模拟就行了,排序. #include<iostream> #include<cstdio> #i ...

  3. Java变量-常量-作用域

    public class Demo05 { /* 变量的命名规范:见名知意 1.类变量/实例变量/局部变量使用驼峰原则命名 2.类名使用Pascal命名法 3.常量名使用大写字母和下划线 4.驼峰原则 ...

  4. 设计模式系列之享元模式(Flyweight Pattern)——实现对象的复用

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  5. 在onBackPress中实现退出拦截时不生效

    现象描述 在快应用中弹出一个弹窗,期望效果是该弹窗在用户确认后再退出,但是使用onbackpress控制确认弹窗后自动退出不生效. 问题分析 快应用引擎实现机制决定了onbackpress不能有耗时的 ...

  6. Debezium实现多数据源迁移(一)

    背景: 某公司有三个数据库,分别为MySql.Oracle和PostgreSql.原有业务的数据都是来自于这三个DB,此处委托将原有的三个数据库整合成一个Mysql. 要求: 1.不影响原有系统的继续 ...

  7. Python爬虫学习一------HTTP的基本原理

    昨天刚买的崔大大的<Python3网络爬虫开发实战>,今天就到了,开心的读完了爬虫基础这一章,现记录下自己的浅薄理解,如有见解不到位之处,望指出. 1.HTTP的基本原理 ①我们经常会在浏 ...

  8. Mysql给外网IP授权访问

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'58.221.44.174' IDENTIFIED BY 'njqt123456' WITH GRANT OPTION; ...

  9. 【odoo14】odoo 14 Development Cookbook【目录篇】

    网上已经有大佬翻译过odoo12并且在翻译odoo14了.各位着急的可以自行搜索下... 这本书是为了让自己从odoo12转odoo14学习.也是为了锻炼下自己... odoo 14 Developm ...

  10. 全网最详细的Linux命令系列-iptrad-ng网络流量监测命令

    观察网络流量的工具:IPTRAF 想知道你的Linux系统上网络流量有多大吗?想知道是哪一块网卡承载着网络流量吗?想知道哪一个进程产生了网络流量吗?iptraf可以帮你做到.在最新的Linux rel ...