HDU 2489 Minimal Ratio Tree(prim+DFS)
Minimal Ratio Tree
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3345 Accepted Submission(s): 1019
Given a complete graph of n nodes with all nodes and edges weighted, your task is to find a tree, which is a sub-graph of the original graph, with m nodes and whose ratio is the smallest among all the trees of m nodes in the graph.
contains n numbers which stand for the weight of each node. The following n lines contain a diagonally symmetrical n×n connectivity matrix with each element shows the weight of the edge connecting one node with another. Of course, the diagonal will be all
0, since there is no edge connecting a node with itself.
All the weights of both nodes and edges (except for the ones on the diagonal of the matrix) are integers and in the range of [1, 100].
The figure below illustrates the first test case in sample input. Node 1 and Node 3 form the minimal ratio tree.
look at the second smallest node number, etc. Please note that the nodes are numbered from 1 .
3 2
30 20 10
0 6 2
6 0 3
2 3 0
2 2
1 1
0 2
2 0
0 0
1 3
1 2
题意描写叙述:
给出n个点的权值和这n个点之间的边的权值。从这n个点之中选出m个点使得这m个点的权值最大,这m个点的生成树中边的权值最小。即Ratio最小。依照升序输出这m个点。
解题思路:
首先n的范围是[2,15],所以能够用dfs搜索使得Ratio最小的点。那么思路基本清晰:首先dfs,搜索全部的点选与不选所得到的最大的Ratio。假设当前状态下得到的Ratio比之前得到的Ratio要小,那么把当前状态的vis数组更新的答案ans数组中。
最后从1到n扫描ans数组就可以保证答案是升序。
參考代码:
#include<stack>
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#pragma commment(linker,"/STACK: 102400000 102400000")
using namespace std;
const double eps=1e-6;
const int INF=0x3f3f3f3f;
const int MAXN=20; int n,m,mincost[MAXN],node[MAXN],edge[MAXN][MAXN];
bool vis[MAXN],used[MAXN],ans[MAXN];
double temp; double prim()
{
memset(mincost,0,sizeof(mincost));
memset(used,false,sizeof(used));
int s;
for(int i=1; i<=n; i++)
if(vis[i])
{
s=i;
break;
}
for(int i=1; i<=n; i++)
{
mincost[i]=edge[s][i];
used[i]=false;
}
used[s]=true;
int res=0;
int nodevalue=node[s];
for(int j=1; j<n; j++)
{
int v=-1;
for(int i=1; i<=n; i++)
if(vis[i]&&!used[i]&&(v==-1||mincost[v]>mincost[i]))//vis[i]表示第i个点有没有被选中
v=i;
res+=mincost[v];
nodevalue+=node[v];
used[v]=true;
for(int i=1; i<=n; i++)
if(vis[i]&&!used[i]&&mincost[i]>edge[v][i])
mincost[i]=edge[v][i];
}
return (res+0.0)/nodevalue;
} void dfs(int pos,int num)
{
if(num>m)
return ;
if(pos==n+1)
{
if(num!=m)
return ;
double tans=prim();
if(tans<temp)
{
temp=tans;
memcpy(ans,vis,sizeof(ans));
}
return ;
}
vis[pos]=true;//选择当前点
dfs(pos+1,num+1);
vis[pos]=false;//不选择当前点,消除标记
dfs(pos+1,num);
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif // ONLINE_JUDGE
while(scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
for(int i=1; i<=n; i++)
scanf("%d",&node[i]);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
scanf("%d",&edge[i][j]);
temp=INF;
dfs(1,0);
bool flag=false;
for(int i=1; i<=n; i++)
{
if(ans[i])
{
if(flag)
printf(" ");
else
flag=true;
printf("%d",i);
}
}
printf("\n");
}
return 0;
}
HDU 2489 Minimal Ratio Tree(prim+DFS)的更多相关文章
- 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+Prim最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2489 Problem Description For a tree, which nodes and ...
- 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
Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU 2489 Minimal Ratio Tree(dfs枚举+最小生成树)
想到枚举m个点,然后求最小生成树,ratio即为最小生成树的边权/总的点权.但是怎么枚举这m个点,实在不会.网上查了一下大牛们的解法,用dfs枚举,没想到dfs还有这么个作用. 参考链接:http:/ ...
- hdu 2489 Minimal Ratio Tree
http://acm.hdu.edu.cn/showproblem.php?pid=2489 这道题就是n个点中选择m个点形成一个生成树使得生成树的ratio最小.暴力枚举+最小生成树. #inclu ...
- HDU 5274 Dylans loves tree(LCA+dfs时间戳+成段更新 OR 树链剖分+单点更新)
Problem Description Dylans is given a tree with N nodes. All nodes have a value A[i].Nodes on tree i ...
- 【2018 ICPC亚洲区域赛沈阳站 L】Tree(思维+dfs)
Problem Description Consider a un-rooted tree T which is not the biological significance of tree or ...
- Codeforces A. Game on Tree(期望dfs)
题目描述: Game on Tree time limit per test 1 second memory limit per test 256 megabytes input standard i ...
随机推荐
- Vue总结(一)
vue总结 构建用户界面的渐进式框架 渐进式:用到什么功能即可使用转么的框架子模块. 两个核心点 向应的数据绑定 当时图发生改变->自动跟新视图,利用Object.defindProperty中 ...
- python获取教务管理系统的MM照片
前提:你的教务管理系统是明文存储大家的图片,加密的图片就不好弄了... 也就是能够通过浏览器直接访问...技术上就不存在什么问题了...如果是学号存储的就更方便了 然后我们就可以写个小脚本了...其实 ...
- 干货分享 -- Math
昼猫笔记 JavaScript -- Math Math也是JS的内置对象,但是它不是一个构造函数,它属于一个工具类不用创建对象,它封装了数学运算相关的属性和方法,今天就来写下常用的函数[API(ap ...
- 【J-meter】参数及相应数据中文显示乱码问题
参考资料: http://www.51testing.com/html/00/130600-1360743.html http://www.cnblogs.com/fengpingfan/p/5851 ...
- Spring MVC学习总结(5)——SpringMVC项目关于安全的一些配置与实现方式
目前越来越多的应用和网站,开始注重安全性的问题,关于我们的web项目的几个安全知识点,不得不讲解一下,这里我主要讲述关于tomcat如何支持HTTPS连接访问,RSA公钥和私钥的制作.这个对于我们整个 ...
- ItelliJ IDEA开发工具使用—创建一个web项目(转)
最近想用IDEA编辑器开发,但是平时都用MyEclipse和eclipse习惯了,突然间用IDEA到处碰壁的感觉.在不断的摸索之后终于苦尽甘来,学会了基本的web程序如何创建以及运行了.期间在网上找了 ...
- JAVA基础实例(二)
1.做一个饲养员给动物喂食物的样例体现JAVA中的面向对象思想,接口(抽象类)的用处 package com.softeem.demo; /** *@authorleno *动物的接口 */ inte ...
- vmware虚拟机Windows 2003上网问题
近期须要在Windows 2003 上面做点操作,于是安装虚拟机玩了一下,发现并不能上网,最后的解决的方法是: 卸载IE增强的安全配置 控制面板→加入或删除程序→加入/删除Windows组件" ...
- js---08函数 定时器
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- 在英语中,in,on,at的用法是?
在几点:at xx:xx ,在那月: in Dec./Jan.……, 在那日:on Thur./Mon.……,on Jan. 16th 时间前面 at, 年月日前面如果有具体的日子,就是具体的哪一天 ...