HDU 2489 Minimal Ratio Tree 最小生成树+DFS
Minimal Ratio Tree
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
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.
【Sample Output】
【题意】
给出一张n个点的图,图中的每一个结点以及每一条边都有其权值,要求从中选出m个点,找到m-1条边将其连接,使得边权值与点权值的比值达到最小。
【分析】
要使得比值最小,则点权值和尽可能地大同时边权值和尽可能地小。直接上考虑,边权值和尽可能小即对这m个点作最小生成树。
而题目给定的n不大,故可以用DFS搜出需要的m个点,然后对m个点进行最小生成树,中间注意判断和保存即可。
我用了一个dijkstra+优先队列的prim去找MST,这也是我第一次尝试使用STL的优先队列。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue> using namespace std; bool flag[],outp[];
int n,m,node[];
int ma[][];
double mi; typedef struct heaptyp
{
int num,key;
friend bool operator < (heaptyp a,heaptyp b)
{
return a.num>b.num;
}
} heaptype; void prim(int s,int tot)
{
int i,j,now,ans;
bool fla[];
priority_queue<heaptype>heap;
heaptype aaa; memset(fla,,sizeof(fla));
fla[s]=true;
ans=;
for (i=;i<=n;i++)
if (flag[i]&&ma[s][i])
{
heaptype temp;
temp.num=ma[s][i];
temp.key=i;
heap.push(temp);
aaa=heap.top();
} for (j=;j<m;j++)
{
heaptype h=heap.top();
heap.pop();
aaa=heap.top();
while (fla[h.key])
{
h=heap.top();
heap.pop();
}
now=h.key;
fla[now]=true;
ans+=h.num;
for (i=;i<=n;i++)
if (flag[i]&&ma[now][i])
if (!fla[i])
{
heaptype temp;
temp.num=ma[now][i];
temp.key=i;
heap.push(temp);
aaa=heap.top();
}
}
double rat=(double)ans/tot;
if (mi-rat>0.0000001)
{
mi=rat;
for (int i=;i<=n;i++) outp[i]=fla[i];
}
} void dfs(int now,int last,int tot)
{
if (now==m)
{
int i;
for (i=;i<=n;i++)
if (flag[i]) break;
prim(i,tot);
}
else
{
now++;
for (int i=last+;i<=n-m+now;i++)
{
flag[i]=true;
dfs(now,i,tot+node[i]);
flag[i]=false;
}
}
} int main()
{
scanf("%d%d",&n,&m);
while (!(n==&&m==))
{
for (int i=;i<=n;i++) scanf("%d",&node[i]);
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) scanf("%d",&ma[i][j]); mi=;
memset(flag,,sizeof(flag));
for (int i=;i<=n-m+;i++)
{
flag[i]=true;
dfs(,i,node[i]);
flag[i]=false;
} int i;
for (i=;i<=n;i++)
if (outp[i])
{
printf("%d",i);
break;
}
for (int j=i+;j<=n;j++)
if (outp[j]) printf(" %d",j);
printf("\n");
scanf("%d%d",&n,&m);
} return ;
}
HDU 2489 Minimal Ratio Tree 最小生成树+DFS的更多相关文章
- 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(暴力+最小生成树)(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(prim+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 ...
- HDU2489 Minimal Ratio Tree 【DFS】+【最小生成树Prim】
Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- {POJ}{3925}{Minimal Ratio Tree}{最小生成树}
题意:给定完全无向图,求其中m个子节点,要求Sum(edge)/Sum(node)最小. 思路:由于N很小,枚举所有可能的子节点可能情况,然后求MST,memset()在POJ G++里面需要cstr ...
- Minimal Ratio Tree HDU - 2489
Minimal Ratio Tree HDU - 2489 暴力枚举点,然后跑最小生成树得到这些点时的最小边权之和. 由于枚举的时候本来就是按照字典序的,不需要额外判. 错误原因:要求输出的结尾不能有 ...
随机推荐
- linuxmint卸载软件
删除你已经卸载掉的软件包的命令为 sudo apt-get autoclean 还有一类软件包,我们每个人都应该删除,那就是你已经卸载了,但是一些只有它依赖而别的软件包都不需要的软件包还留在你的系统里 ...
- AJAX 在手机上用时
Response.ContentType = "text/html; text/plain; charset=UTF-8";
- Inno Setup入门(十二)——Pascal脚本(1)
事件函数(1) Inno Setup支持以下函数和过程. function InitializeSetup(): Boolean; 该函数在安装程序初始化时调用,返回False 将中断安装,True则 ...
- 更改 android realtek的系统权限
由于在 在删除系统的文件时候出现 Read-only file system,所以要获取权限. 推出shell adb mount mount -o rw,remount /system 就可以了
- FreeRTOS中断优先级配置(重要)
FreeRTOS中断优先级配置(重要) 本章节为大家讲解FreeRTOS中断优先级配置,此章节非常重要,初学者经常在这里犯迷糊.对于初学者来说,本章节务必要整明白.12.1 NVIC基础知识12.2 ...
- Lua基础(一)
1.Lua中有8个基本类型分别为:nil.boolean.number.string.userdata.function.thread和table 2.Lua中的表达式包括数字常量.字符串常量.变量. ...
- Beam me out!
Beam me out! 题目描述 King Remark, first of his name, is a benign ruler and every wrongdoer gets a second ...
- 什么是Jsp
1.什么是jsp java server page(java 服务器端页面技术),是 sun 公司制订的一种服务器端动态页面生成技术的规范. 因为直接使用 servlet 生成页面,如果页面比较复杂, ...
- HDU - 1865 1string(大数)
题目链接:http://acm.hust.edu.cn/vjudge/contest/121397#problem/F http://acm.hdu.edu.cn/showproblem.php?pi ...
- [原]左右的移动<<>><>jQuery的实现
$(function () { $('#toAllLeft').click(function () { $('#se1 option').app ...