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> < ...
- Codevs 2894 Txx考试
时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description Txx是一个成绩很差的人,考试便成了他的噩梦.于是他常在考试时睡觉以打发时间.今天 ...
- 记一次linux samba服务问题调试
linux下samba服务加入windows域控后,samba共享名与合法用户名不应一致,否则无法访问此共享.
- 私人定制自己的linux小系统
私人定制自己的linux小系统 一.前言 linux操作系统至1991.10.5号诞生以来,就源其开源性和自由性得到了很多技术大牛的青睐,每个linux爱好者都为其贡献了自己的一份力,不管是在 ...
- ASP.NET MVC局部验证及相关问题
在上一篇“asp.net mvc常用的数据注解和验证以及entity framework数据映射”话题中,有的博友提到 ‘“同一个实体在3-4个地方会发生修改,每个修改需要验证的方式都不一样,后端就不 ...
- 【转】HttpServletRequest.getParameter() &HttpServletRequest.getAttribute() 区别
Ref: HttpServletRequest的getParameter和getAttribute方法有什么区别 具体如下几点: (1)HttpServletRequest类有setAttribute ...
- sql server 查询多个不关联表且对结果编号
1.除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图.内联函数.派生表.子查询和公用表表达式中无效. 解决方法:top 100 percent * 2.如何对查询结果编 ...
- Golang container/ring闭环数据结构的使用方法
//引入包 import "container/ring" //创建闭环,这里创建10个元素的闭环 r := ring.New(10) //给闭环中的元素附值 for i := 1 ...
- nginx配置:支持phpfastcgi,nginx和php-cgi通信,部分nginx常量解释
支持phpfastcgi的配置如下: server { listen 8000; server_name localhost; root F:/home/projects/test; i ...
- ASP.NET中的母版页机制
项目中用到了母版页,由于好长时间没用了,不太熟悉起原理,在网上找了一下: http://www.cnblogs.com/_zjl/archive/2011/06/12/2078992.html 有时间 ...