poj 2728 最优比例生成树

315、弱电基础知识介绍 常见的弱电系统包括:闭路电视监控系统、防盗报警系统、门禁系统、电子巡更系统、停车场管理系统、可视对讲系统、家庭智能化系统及安防系统、背景音乐系 统、LED显示系统、等离子拼接屏系统、DLP大屏系统、三表抄送系统、楼宇自控系统、防雷与接地系统、寻呼对讲及专业对讲系统、弱电管道系统、UPS不 间断电源系统、机房系统、综合布线系统、计算机局域网系统、物业管理系统、多功能会议室系统、有线电视系统、卫星电视系统、卫星通讯系统、消防系统、电话 通讯系统、酒店管理系统、视频点播系统、人力资源管理系统等等。 阅读详情
题目链接

相关知识


解法之一 0-1分数规划
设x[i]等于1或0, 表示边e[i]是否属于生成树.
则我们所求的比率 r=∑(benifit[i]∗x[i])/∑(cost[i]∗x[i]),0≤i<m .
为了使 r 最大, 设计一个子问题—> 让 z=∑(benifit[i]∗x[i])−l∗∑(cost[i]∗x[i])=∑(d[i]∗x[i]) 最大 (d[i]=benifit[i]−l∗cost[i]) , 并记为z(l). 我们可以兴高采烈地把z(l)看做以d为边权的最大生成树的总权值.
然后明确两个性质:
1. z单调递减
  证明: 因为cost为正数, 所以z随l的减小而增大.
2. z( max(r) ) = 0
  证明: 若 z(max(r))<0,∑(benifit[i]∗x[i])−max(r)∗∑(cost[i]∗x[i])<0 , 可化为 max(r) < max(r). 矛盾;
  若z( max(r) ) >= 0, 根据性质1, 当z = 0 时r最大.
到了这个地步, 七窍全已打通, 喜欢二分的上二分, 喜欢Dinkelbach的就Dinkelbach.
已知一个完全图,每条边有两个参数(dis和c),求一棵生成树,使(∑xi×ci)/(∑xi×disi)最小,其中xi当第i条边包含在生成树中时为1,否则为0。
迭代法:
假设rate为当前比率,以ci-rate×disi作为各边的权重,使用Prim算法构造最小生成树,再对该最小生成树求(∑xi×ci)/(∑xi×disi)更新rate,可证明rate可收敛且收敛值即为所求。
二分法:
在一个精度范围内(以1e-6为例),二分查找[0,maxRate]之间的值rate,使(z=∑xi×ci-rate×∑xi×disi)==0,可证明该值即为所求。其中xi为以ci-rate×disi作为各边权重时,使用Prim算法所构造的最小生成树。在二分搜索过程中若z>0,则将区间上移(low=mid+1),否则将区间下移(high=mid-1)。
使用迭代法,以0作为初始迭代比率:188MS
使用二分法,固定查找范围为[0,31],精度为1e-6:1422MS(不知二分法大家都有什么优化,分享一下吧^_^)

下面介绍一下该题目的解题思路及相关证明:

1、问题转化:

给定一个rate, z(rate)=∑xi×ci−rate∗∑xi×disi ,xi为一棵生成树使(∑xi×ci-rate*∑xi×disi)的值最小(下面会介绍求此生成树的方

法),则rate=(∑xi×ci-z(rate))/( ∑xi×disi),令rateNex=(∑xi×ci)/( ∑xi×disi)。

若z(rate)>0,则肯定不存在一棵生成树使rate=(∑yi×ci)/( ∑yi×disi),即rate值无效,且有rateNex >rate;

若z(rate)<0,则我们可得到一个有效比率rateNex,且 rateNex<rate ;
若z(rate)==0,则rateNex==rate,且rate有效。

因此,如果有且仅有一个rate使z(rate)==0,又由题目所求的最小比率的存在性(有限节点的完全图其生成树只有有限个)可知,该rate值即为所求。

下面证明其存在性和唯一性:

存在性:对于题目所求的最小比率rateMin,由上面的分析必有z(rateMin)=0,又由该最小比率的存在性可知,至少存在一个有效的比率rate使z(rate)=0;

唯一性:只要证明z(rate)函数的单调性即可:

     对于两个比率rate1<rate2,

     z(rate1)-z(rate2)= (∑xi×ci-rate1*∑xi×disi)-(∑yi×ci-rate2*∑yi×disi)

                                 <=(∑yi×ci-rate1*∑yi×disi)-(∑yi×ci-rate2*∑yi×disi)

                                 =(rate2-rate1)* ∑yi×disi>0

     因此,z(rate)为单调递减函数。从而也就证明了满足z(rate)==0的比率rate的唯一性。

由上面的分析,我们就将问题转化为求解比率rate使z(rate)==0。

2、求解:有两种方法对该问题进行求解:迭代法和二分法。

     A、迭代法:由上面的分析可知:

               当 z(rate)>0时,rate值无效,而rateNex有效且z(rateNex)<=0;

               当z(rate)<0时,rateNex<rate,又z(rate)为单调递减函数,故0>=z(rateNex)>z(rate)。

              故迭代过程向z(rate)==0收敛,又由有限节点的完全图其生成树只有有限个可知迭代次数必为有限值。

     B、二分法:在定出一个搜索范围和精度之后(以[0,MAXRATE]为例),我们就可以使用二分法进行搜索:对于当前的搜索区间[low,high],mid=(low+high)/2,根据z(mid)的值及z(rate)的增减性,对搜索区间进行更新:
               若z(mid)>0,上调区间,使low=mid+1;

               若z(mid)<0,下调区间,使high=mid-1;

从而在经过有限次搜索之后便能找到所求比率。

3、求解生成树xi使(∑xi×ci-rate*∑xi×disi)的值最小的方法:

∑xi×ci-rate*∑xi×disi=∑xi(ci+rate×disi),从而问题转化为以ci+rate×disi为边的权重,求解最小生成树,对于完全图,可使用

prim算法,其复杂度只与节点数有关。

简单来说(迭代的不是二分)

1.先设比率r=0,对于每条边,我们计算一个新的权值,权值为w[i][j]=c[i][j]-r*d[i][j] (其中c[i][j]为第i个点和第j个点的垂直高度差,d[i][j]为水平距离,w[i][j]为计算出来的权值)

2.以这个权值去构建最小生成树,用prim算法(时间复杂度只与顶点数有关)去构建。最后统计这个MST的垂直高度差的和sumc,水平距离的和sumd,算出新的比率为R=sumc/sumd;

3.判断新的比率和R和旧的比率r是否相等(精度范围内,这里设为0.00001),如果相等那么R就是答案,否则就r=R(迭代),然后再次去做(1),依次循环直到找到答案


代码

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
const double inf = 1e15;
const int maxn = 1000+10;
const double eps = 1e-5;
struct node {
    double  x, y, z;
}p[maxn];
int n;
double Dis[maxn];
int pre[maxn], vis[maxn];
double g[maxn][maxn];
double cost[maxn][maxn];
double dis[maxn][maxn];
double D(node a, node b) {
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

double prim(double r) {
    for (int i=1; i<=n; i++) {
        g[i][i] = 0;
        for (int j=i+1; j<=n; j++)
            g[i][j] = g[j][i] = cost[i][j]-r*dis[i][j];
    }
    for (int i=2; i<=n; i++) {
        Dis[i] = g[1][i];
        vis[i] = 0;
        pre[i] = 1;
    }
    Dis[1] = 0;
    vis[1] = 1;
    for (int i=0; i<n-1; i++) {
        double minn = inf;
        int k = -1;
        for (int j=1; j<=n; j++) {
            if (!vis[j] && Dis[j] < minn) {
                minn = Dis[j];
                k = j;
            }
        }
        vis[k] = 1;
        for (int j=1; j<=n; j++) {
            if (!vis[j] && Dis[j] > g[k][j]) {
                Dis[j] = g[k][j];
                pre[j] = k;
            }
        }
    }
    double C = 0, D = 0;
    for (int i=1; i<=n; i++) {
        C += cost[i][pre[i]];
        D += dis[i][pre[i]];
    }
    return C/D;
}

int main() {
    while (~scanf("%d", &n)) {
        if (n == 0)
            break;
        for (int i=1; i<=n; i++)
            scanf("%lf%lf%lf", &p[i].x, &p[i].y, &p[i].z);
        for (int i=1; i<=n; i++) {
            dis[i][i] = 0, cost[i][i]= 0;
            for (int j=i+1; j<=n; j++) {
                dis[i][j] = dis[j][i] = D(p[i], p[j]);
                cost[i][j] = cost[j][i] = fabs(p[i].z-p[j].z);
            }
        }
        double r1 = 0, r2 = 0, ans;
        while (1) {
            r2 = prim(r1);
            if (fabs(r2-r1) <= eps) {
                ans = r2;
                break;
            }
            r1 = r2;
        }
        printf("%.3f\n", ans);
    }
    return 0;
}
1、CUDA 编程基础 GPU计算的发展历程与重要性。首先回顾了计算机技术的发展,特别是摩尔定律的影响,强调了计算能力的快速提升。然而,随着晶体管尺寸的缩小和频率的停滞,单线程性能增长放缓。为了继续提升性能,多核处理器开始普及,促使软件开发者开始考虑并行计算。介绍了延迟导向设计和吞吐量导向设计的概念,CPU和GPU分别代表了这两种设计方法。GPU是吞吐量导向的,拥有众多弱小的ALU,通过流水线处理提高算术吞吐量。GPU的成功在于其高并行性和高吞吐量,以及能够分摊高昂的固定成本的大量销售额。 阅读详情

相关推荐

【ESP32 S3 开发】基于I2S协议驱动INMP441数字麦克风 实现语音采集

注意INMP441的 L/R接地之后才稳定输出数据 否则一直都是0WAV格式说明这里主要是想说wav文件重要的就是生成一个wavhead来标识它是一个wave文件,wave文件的data chunk 中的data部分还是PCM编码格式的数据,直接从I2S读进去就可以,不需要压缩。wav文件的头一般由4个chunk组成。 以16bit深度为例,代码如下。其他深度可以根据注释自行计算。 I2S -> DAC i2s_read()函数,向flash中划分的一个buff当中读入byte数组。以16bit深度为例,一

m0_43395703的博客 1万+

[POJ 2728] 最优比例生成树

POJ 2728 最优比例生成树

SIOFive的专栏 1616

【AI Infra】【RLHF框架】VeRL中WorkerGroup与Ray资源调度的协同机制剖析

本文深入剖析了VeRL框架中WorkerGroup与Ray资源调度的协同机制。通过解析Ray Placement Group的资源抽象和VeRL的RayResourcePool封装,详细阐述了WorkerGroup如何与底层资源精确绑定,并实现RLHF训练中异构、多阶段任务的灵活资源分配与动态调整,为大规模分布式强化学习训练提供了高效解决方案。

weixin_29204205的博客 391

【POJ 2728】Desert King (最优比例生成树)

&#13; 传送门here&#13; 这是一道01分数规划之最优比例生成树的入门题&#13; 类似的 我们对于每次check 预处理d数组(代码里是lowcost[])由于是稠密图 跑一遍prim&#13; 由于prim就是通过贪心,保证每次选的边最优来做的,所以只用统计最小生成树的权值有没有大于0&#13; &#13; #include&lt;iostream&gt;&#1...

Patrickpwq 145

Halcon窗体开发避坑指南:C#自定义控件实现7大图像交互功能

本文详细介绍了如何利用C#封装自定义Halcon控件,以解决原生HWindowControl功能不足的问题。通过实战代码,展示了如何实现图像按比例显示、鼠标拖动缩放、灰度值读取、图像保存、截图及图形叠加等七大核心交互功能,并重点剖析了内存管理、坐标转换等开发避坑要点,帮助开发者构建稳定可复用的机器视觉组件库。

weixin_29251131的博客 292

20、机器人硬件改造与Geomagic Touch设备的运动学和动力学模型

本文详细介绍了机器人CRS 465和255的硬件改造过程,包括数字阶段、模拟阶段、功率阶段及软件实现,并深入研究了Geomagic Touch触觉设备的五自由度与三自由度运动学、微分运动学及动力学模型。文章还探讨了其在虚拟手术、装配等场景中的应用,提出了硬件与模型优化方向,如电源管理改进、信号处理优化、参数校准与自适应控制,并展望了多机器人协作、多传感器融合与智能控制算法的发展前景。

e4f5g6h7的博客 122

POJ 2728 最优比例生成树

题意:给定三维的点,求这样一棵树,使得高度差的和与水平距离的和的比值最小 这题是很显然的最优比例生成树,不能用贪心求出cost/len,再建MST。 详细做法见http://hi.baidu.com/zzningxp/blog/item/b2d1b4ec1f8bbc2262d

mickeyandkaka的专栏 937

扫地机器人设计与实现——基于嵌入式系统的智能家居解决方案

本文介绍了基于嵌入式技术的扫地机器人设计与实现。通过利用STM32单片机、传感器、驱动系统等硬件组件,并结合路径规划与控制算法、远程控制等软件技术,设计出了一款具有智能避障、路径规划、自动充电等功能的扫地机器人。系统的开发不仅提高了清洁效率,也为进一步研究和优化扫地机器人提供了实践基础。

2201_76125393的博客 1639

poj 2728 Desert King(最优比例生成树)

poj 2728 Desert King(最优比例生成树) 分类: Algorithm-动态规划2013-07-25 13:30 106人阅读 评论(0) 收藏 举报 [cpp] view plaincopyprint? #include    #include    #include    #include    #inclu

pi9nc的专栏 755

开源模型应用落地-qwen模型小试-入门篇(二)

在windows环境下,使用transformer设置模型参数/System Prompt/历史对话

以微薄之力,予他人些许温暖. 3237

vue3 - 详细实现用户收货地址识别解析“姓名/手机号/省市区/街道/乡镇村庄“关键字,用户复制粘贴一段含有姓名电话/详细地址的文字文本信息,vue3自动识别拆分并填入到对应表单字段中,详细示例代码

vue3,nuxt3,快递地址读取,收货地址解析、快递地址解析、物流地址解析自动识别,收货地址解析,从发货地址中拆出姓名电话地址,根据粘贴的字符串提取姓名地址,vue3地址信息自动识别,ts,vue3智能识别地址,提取姓名电话地址信息,自动识别出省市区街道姓名手机号等,根据文本自动解析出收货信息,怎么识别文本中的手机号,粘贴板地址识别,地址智能识别,如何识别收货地址中的关键字,粘贴一段文字后,自动识别到姓名/手机号/收货地址,vue3仿淘宝地址智能识别解析实现,省市区街道智能解析,vue3收货地址,识别地址

✅ 精选推荐文章 5502

POJ 2728 Desert King 最优比例生成树

最优比例生成树,迭代方法..... Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 21086   Accepted: 5916 Description David the Great has just

码代码的猿猿 1066

ADC实现模数转换Multisim电路仿真——硬件工程师笔记

8位模数转换器(ADC)是将模拟信号转换为8位数字信号的电子器件,具有256级量化能力。其工作原理分为采样、量化和编码三个阶段,关键参数包括分辨率、采样率、精度、线性度和信噪比。常见型号有ADC0804、ADC0808等,广泛应用于数据采集、音频处理、通信系统和消费电子产品中。典型应用时需要配置参考电压、模拟输入和数字输出引脚,并通过仿真实验验证转换效果(如-10V对应输出0,10V对应255)。硬件工程师需掌握其原理和参数选择,相关笔试面试资料可在优快云博客获取。

XU157303764的博客 1509

poj 2728 Desert King(最优比例生成树)

题意:给你一些坐标以及坐标的权值ci,求一棵生成树,使(∑xi×ci)/(∑xi×bi)最小 思路:听说楼教主当年1a了这题,前来膜拜…. 这题是最优比率生成树 http://blog.acmj1991.com/?p=747 #include #include

acmj1991 1034

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

poj2728 Desert King,最优比例生成树

题意:有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一条路即可,          建造水管距离为坐标之间的欧几里德距离(好象是叫欧几里德距离吧),费用为海拔之差          现在要求方案使得费用与距离的比值最小 很显然,这个题目是要求一棵最优比率生成树, 0-1分数规划,0-1分数规划是分数规划的一种特殊情况,分数规划适用于求解最优化问题的,对于

天亮说晚安 3201

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

poj 2728 Desert King 最优比例生成树

Desert KingTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 12256 Accepted: 3455<br />DescriptionDavid the Great has just become the king of a desert country. To win the respect of his people, he decided to build channels all over his country to b

kongming_acm的专栏 813

POJ 2728 Desert King(最优比例生成树)

题目大意 有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一条路即可,建造水管距离为坐标之间的欧几里德距离,费用为海拔之差,现在要求方案使得费用与距离的比值最小,很显然,这个题目是要求一棵最优比率生成树。 解法 有带权图G, 对于图中每条边e[i], 都有benefiti和costi, 我们要求的是一棵生成树T, 它使得 ∑(benefit[i]) / ∑(cost

你真的介意真的在乎真的想要真的渴望的话你一定能够做到 387

沙漠之王【最优比例生成树】【poj2728】

题目传送门 #include<iostream> #include<algorithm> #include<cmath> #include<string.h> #include<stdio.h> const int N=3010; const int inf=0x3f3f3f3f; using namespace std; int n; ...

谁是凶手1703 199

POJ2728 Desert King 最优比例生成树

poj 2728Desert King

Resurgence_zc的博客 798

POJ 2728 Desert King (最优比例生成树)

POJ2728 无向图中对每条边i 有两个权值wi 和vi 求一个生成树使得 (w1+w2+...wn-1)/(v1+v2+...+vn-1)最小。 采用二分答案mid的思想。 将边的权值改为 wi-vi*mid. 对所有边求和后除以v 即为 (w1+w2+...wn-1)/(v1+v2+...+vn-1)-mid. 因此,若当前生成树的权值和为0,就找到了答案。否则更改二分上下界。

nd71pbt7的专栏 518

POJ 2728 Desert King (最优比例生成树)

Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17772   Accepted: 5011 Description David the Great has just become the king of a desert country. To...

weixin_34334744的博客 92

POJ2728 最优比例生成树裸题

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <stack> using namespace std; #define N 1010...

anlao1344的博客 154

POJ 2728 Desert King (最优比例生成树)

Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 18116   Accepted: 5087 Description David the Great has just become the king of a desert country. To win ...

jackgege的专栏 181

POJ-2728-Desert King

POJ-2728-Desert King http://poj.org/problem?id=2728 有N个村庄,给出每个村庄的坐标和海拔,,benifit为两点之间的距离,cost为两点的高度差,现在要求一棵树使得 cost / benift 最小,即求一个最优比例生成树 第一次遇见这种生成树,在网上找了个解法 假设sigma(h)/sigma(l)==K 均值K可取,即: sigma

菜鸟的程序人生 2317
上一篇: poj 2686 状态压缩
下一篇: HDU 5855 二分搜索+最大流
nielaishan
博客等级 码龄11年 7粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值