hdu2489-DFS+最小生成树
题意:
给你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+最小生成树的更多相关文章
- 图的全部实现(邻接矩阵 邻接表 BFS DFS 最小生成树 最短路径等)
1 /** 2 * C: Dijkstra算法获取最短路径(邻接矩阵) 3 * 6 */ 7 8 #include <stdio.h> 9 #include <stdlib.h> ...
- 【wikioi】1002 搭桥(dfs+最小生成树)
http://wikioi.com/problem/1002/ 今天开始又开始刷水了哈T_T.照着hzwer神犇的刷题记录刷!!! 题解: 一开始我也不会,但是我想到了直接爆搜T_T. 好吧,题解. ...
- 【POJ 1639】 Picnic Planning (最小k度限制生成树)
[题意] 有n个巨人要去Park聚会.巨人A和先到巨人B那里去,然后和巨人B一起去Park.B君是个土豪,他家的停车场很大,可以停很多车,但是Park的停车场是比较小.只能停k辆车.现在问你在这个限制 ...
- Code VS 1002 搭桥
题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物.现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着矩形的方格的边沿搭建 ...
- 【牛客提高训练营5B】旅游
题目 吉老师的题时过一年还是不会做 从\(1\)号点出发经过每条边至少一次并且还要回到\(1\)号点,这跟欧拉回路的条件非常像,但是欧拉回路的实际上是"经过每一条边恰好一次并且回到出发点&q ...
- HDU2489 Minimal Ratio Tree 【DFS】+【最小生成树Prim】
Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- hdu2489 Minimal Ratio Tree dfs枚举组合情况+最小生成树
#include <stdio.h> #include <set> #include <string.h> #include <algorithm> u ...
- HDU 2489 Minimal Ratio Tree(dfs枚举+最小生成树)
想到枚举m个点,然后求最小生成树,ratio即为最小生成树的边权/总的点权.但是怎么枚举这m个点,实在不会.网上查了一下大牛们的解法,用dfs枚举,没想到dfs还有这么个作用. 参考链接:http:/ ...
- HDU 5723 Abandoned country (最小生成树 + dfs)
Abandoned country 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5723 Description An abandoned coun ...
- HDU 5723 Abandoned country (最小生成树+dfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5723 n个村庄m条双向路,从中要选一些路重建使得村庄直接或间接相连且花费最少,这个问题就是很明显的求最 ...
随机推荐
- 永恒之蓝(MS17-010)检测与利用
目录 利用Nmap检测 MSF反弹SHELL 注意 乱码 参考 利用Nmap检测 命令: nmap -p445 --script smb-vuln-ms17-010 [IP] # 如果运行报错,可以加 ...
- AntDesign Pro + .NET Core 实现基于JWT的登录认证
很多同学说AgileConfig的UI实在是太丑了.我想想也是的,本来这个项目是我自己使用的,一开始甚至连UI都没有,全靠手动在数据库里修改数据.后来加上了UI也是使用了老掉牙的bootstrap3做 ...
- HDOJ-1029(简单dp或者排序)
Ignatius and the Princess IV hdoj-1029 这里主要是先排序,因为要找出现了一半以上的数字,所以出现的数字一定在中间 方法一: #include<iostrea ...
- MySQL 40题练习题和答案
2.查询"生物"课程比"物理"课程成绩高的所有学生的学号: 思路: 获取所有有生物课程的人(学号,成绩) - 临时表 获取所有有物理课程的人(学号, ...
- Spring Boot 自动配置 源码分析
Spring Boot 最大的特点(亮点)就是自动配置 AutoConfiguration 下面,先说一下 @EnableAutoConfiguration ,然后再看源代码,到底自动配置是怎么配置的 ...
- 开发C语言的3款神器,VS2019、VScode和IntelliJ Clion
一.Visual Studio 2019环境安装配置+代码调试 环境安装配置 首先我们要在Visual Studio官方网站去下载安装包 进入官网后会发现有三种版本可供下载,分别是社区版.专业版和企业 ...
- 计算机图形学中使用Turbo C++画图步骤
一.下载安装Turbo C++ 我安装的是Turbo C++ 3.2.2.0下载链接 二.画图 1.打开Turbo C++,点击右下角start turbo C++ 2.点击file ->new ...
- javaIO中的序列化和反序列化
javaIO中的序列化和反序列化 1.什么是序列化?它是来解决什么问题的 1.我们创建的对象,一般情况下在内存中,程序关闭,或者因为没有地址指向而导致垃圾回收 2.这样,我们的对象就会丢失 3.那么我 ...
- 前端 | 使用 ECharts 绘制关系图
0 需求 做的项目需要画一个关系图,主要需求如下: 需要展示6种对象之间的关系:数据机构 数据 合约 模型 计算机构 应用 支持突出显示6种对象中的某一种的所有对象 支持Top x子图功能.top x ...
- [状压DP]子矩阵
子 矩 阵 子矩阵 子矩阵 题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵 如,下面左图中选取第 2 . 4 ...