HDU 2489 Minimal Ratio Tree(dfs枚举+最小生成树)
想到枚举m个点,然后求最小生成树,ratio即为最小生成树的边权/总的点权。
但是怎么枚举这m个点,实在不会。
网上查了一下大牛们的解法,用dfs枚举,没想到dfs还有这么个作用。
参考链接:http://blog.csdn.net/xingyeyongheng/article/details/9373271
#include <stdio.h>
#include <string.h>
#include <set>
#include <vector>
#include <queue> using namespace std; const int INF=0x3f3f3f3f;
int n,m,tot; //tot为选取的m个点的总权值
int choseNode[]; //存储选取的m个点
int tmp[]; //存储最小ratio的m个点
int nodew[],w[][]; //nodew[i]存储点i的权值,w[i][j]存储边的权值
int dis[],vis[];
double minratio=0x3f3f3f3f; int prim(){
int ans=;
memset(dis,INF,sizeof(dis));
memset(vis,,sizeof(vis));
int t,idx;
dis[choseNode[]]=;
for(int i=;i<=m;i++){
t=INF;
for(int i=;i<m;i++){
if(!vis[choseNode[i]] && dis[choseNode[i]]<t){
t=dis[choseNode[i]];
idx=choseNode[i];
}
}
vis[idx]=;
ans+=t;
for(int i=;i<m;i++){
int u=choseNode[i];
if(!vis[u] && w[idx][u]<dis[u]){
dis[u]=w[idx][u];
}
}
}
return ans;
}
/*
dfs枚举m个点,num代表目前选取了多少个点,k代表第num个点为k。
表示前num个点选自1~k,剩余的点从k+1~n中选。
*/
void dfs(int k,int num){
if(num==m){
tot=;
for(int i=;i<m;i++){
tot+=nodew[choseNode[i]];
}
int sum=prim();
double tmpratio=sum*1.0/tot;
if(tmpratio<minratio){
minratio=tmpratio;
for(int i=;i<m;i++){
tmp[i]=choseNode[i];
}
}
return; //忘记写return了。。。
}
//若剩余的点的个数(n-k)加上目前选取的个数num小于m的话,说明即使接下来n-k个点都选取,也选不足m个点,直接return
if(n-k+num<m)
return;
for(int i=k+;i<=n;i++){
//选的点用数组存起来
choseNode[num]=i;
dfs(i,num+);
}
}
int main()
{
int a;
while(scanf("%d%d",&n,&m)!=EOF){
if(n== && m==)
break;
memset(w,,sizeof(w));
minratio=INF*0.1;
for(int i=;i<=n;i++){
scanf("%d",&nodew[i]);
}
for(int i=;i<=n;i++){
for(int j=;j<=i;j++)
scanf("%d",&a);
for(int j=i+;j<=n;j++){
scanf("%d",&a);
w[i][j]=w[j][i]=a;
}
}
for(int i=;i<=n;i++){
choseNode[]=i;
dfs(i,);
}
for(int i=;i<m-;i++){
printf("%d ",tmp[i]);
}
printf("%d",tmp[m-]);
printf("\n");
}
return ;
}
最后再附上网上看到的另一种dfs枚举的写法:
//调用时:dfs(1,0,0); //dep表示点的编号,cnt表示选取的点的个数,sum_pw表示目前选取了cnt个点后总的点权值
void dfs(int dep, int cnt, int sum_pw) {
if(cnt == m) {
...;
return ;
}
if(dep == n + ) return ;
use[dep] = true; //选取点dep,这里use[i]=true表示选取点i,在用prim求最小生成树的时候有用
dfs(dep + , cnt + , sum_pw + weight[dep]);
use[dep] = false; //不选取点dep
dfs(dep + , cnt, sum_pw);
}
HDU 2489 Minimal Ratio Tree(dfs枚举+最小生成树)的更多相关文章
- HDU 2489 Minimal Ratio Tree (DFS枚举+最小生成树Prim)
Minimal Ratio Tree Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) ...
- HDU 2489 Minimal Ratio Tree (dfs+Prim最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2489 Problem Description For a tree, which nodes and ...
- 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 ...
- HDU 2489 Minimal Ratio Tree 最小生成树+DFS
Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU 2489 Minimal Ratio Tree(prim+DFS)
Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- hdu 2489 Minimal Ratio Tree
http://acm.hdu.edu.cn/showproblem.php?pid=2489 这道题就是n个点中选择m个点形成一个生成树使得生成树的ratio最小.暴力枚举+最小生成树. #inclu ...
- hdu2489 Minimal Ratio Tree dfs枚举组合情况+最小生成树
#include <stdio.h> #include <set> #include <string.h> #include <algorithm> u ...
- Minimal Ratio Tree HDU - 2489
Minimal Ratio Tree HDU - 2489 暴力枚举点,然后跑最小生成树得到这些点时的最小边权之和. 由于枚举的时候本来就是按照字典序的,不需要额外判. 错误原因:要求输出的结尾不能有 ...
- HDU2489 Minimal Ratio Tree 【DFS】+【最小生成树Prim】
Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
随机推荐
- 解析XML文档之二:使用PULL解析
第一步:解析文档为一下文档 <?xml version="1.0" encoding="UTF-8"?> <students> < ...
- Ubontu使用技巧
1. ctrl + alt + T => 打开命令行窗口 2. sudo su => 开启root权限 3. cd => 打开文件夹 4. cd "Program F ...
- WPF 绑定一(数据源为控件)
xaml: <Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.co ...
- C#各种常用开源框架-支持开源!分享!
下面罗列了开发及学习过程中所涉及的开源类库的列表! AForge.NET Accord.NET NAudio nVLC Speex C# WebServer FFmpeg FFmpeg.NET Flo ...
- linux中nodejs后台运行工具forever
forever让nodejs应用后台执行 命令如下: forever start './bin/www' nodejs一般是当成一条用户命令执行的,当用户断开客户连接,运用也就停了,很烦人.如何让no ...
- IDEA操作GIT说明
公司的代码库从TFS升级到了GIT,我们的自动化测试代码就需要迁移到git上.操作如下: 1.安装GIT 安装完成后,在IDEA中配置git安装路径 2.在本地磁盘新建一个空目录,例如:D:\Wo ...
- 基于Python的密码生成程序的优化
近期刚刚组织完内部的Python基础培训.GUI的开发培训,之后布置的作业是两人一组,利用前面所写的一些模块做一些小软件. 具体就是模拟Advanced Password Generator这个软件的 ...
- C# 发邮件类可发送附件
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Ne ...
- c语言调试接口
http://blog.chinaunix.net/uid-10106787-id-2985587.html 在C语言程序设计中,常会出现各种各样的bug:段错误.参数异常等等.我们需要尽快定位错误, ...
- ZOJ 2314 带上下界的可行流
对于无源汇问题,方法有两种. 1 从边的角度来处理. 新建超级源汇, 对于每一条有下界的边,x->y, 建立有向边 超级源->y ,容量为x->y下界,建立有向边 x-> 超级 ...