分析

Part 1 模板题

最优比率生成树,01规划的模板题

但是!

他卡常

所以,孩子们还是乖乖写Dinkelbach吧

Part 2 01分数规划

欢迎造访我的blog:01分数规划

Part 3 最小值

我们需要求的是

中R的最小值,(x[i][j]代表这条边是否选)

稍微移项变换一下,就变成了:

可以看出,当R 减小的时候,左边的式子的值会增大。

若对于某一个确定的R值,左边的值是可以小于0的,

也就说明存在一个更小的R值能使左边的式子更加接近于0

这样,我们可以增大R 的值再次验证,直到找到最小的R值为止

当然可以二分解决,验证的时候,以cost[i][j]-R*dis[i][j]为权值求最小生成树

由于是一个完全图,n2的prim显然更优秀,用邻接矩阵存也方便

一切都很好

但是!

恭喜你,TLE快乐

这时,我们就需要更优秀的Dinkelbach算法

简单说来就是直接跳横截距

举个栗子(要糖炒的)

假如我们对于一个R值,找到了一个最小生成树的方案使得生成树上的所有边的权值cost[i][j]-R*dis[i][j]的和小于0

我们下一步就直接跳到令这颗生成树的所有权值和等于0的R上

理论上会快一点

不过这种算法与二分各有千秋,各有擅长的部分,根据题意选择正确适合的就好

看核心代码:

Prim

主程序

代码

  1 /********************
  2 User:Mandy
  3 Language:c++
  4 Problem:
  5 ********************/
  6 #include<bits/stdc++.h>
  7
  8 using namespace std;
  9
 10 typedef long long ll;
 11 typedef double dou;
 12
 13 const int maxn = 1005;
 14 const dou esp = 1e-8;
 15
 16 int t,n,size;
 17 double d[maxn];
 18 int from[maxn];
 19 double dis[maxn][maxn],cost[maxn][maxn];
 20
 21 struct Node{
 22     int x,y,z;
 23 }node[maxn];
 24
 25
 26 template<class T>inline void read(T &x){
 27     x = 0;bool flag = 0;char ch = getchar();
 28     while(!isdigit(ch)) flag |= ch == '-',ch = getchar();
 29     while(isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48),ch = getchar();
 30     if(flag) x = -x;
 31 }
 32
 33 template<class T>void putch(const T x){
 34     if(x > 9) putch(x / 10);
 35     putchar(x % 10 | 48);
 36 }
 37
 38 template<class T>void put(const T x){
 39     if(x < 0) putchar('-'),putch(-x);
 40     else putch(x);
 41 }
 42
 43 void file(){
 44     freopen("build3.in","r",stdin);
 45     freopen("build.out","w",stdout);
 46 }
 47
 48 void readdata(){
 49     for(int i = 1;i <= n; ++ i){
 50         read(node[i].x);
 51         read(node[i].y);
 52         read(node[i].z);
 53     }
 54 }
 55
 56 double dist(int i,int j){
 57     return sqrt(((dou)node[i].x - node[j].x) *
 58                 ((dou)node[i].x - node[j].x) +
 59                 ((dou)node[i].y - node[j].y) *
 60                 ((dou)node[i].y - node[j].y));
 61 }
 62
 63 void init(){
 64     for(int i = 1;i <= n; ++ i){
 65         for(int j = i;j <= n; ++ j){
 66             dis[i][j] = dist(i,j);
 67             dis[j][i] = dis[i][j];
 68             cost[i][j] = abs((double)node[i].z - node[j].z);
 69             cost[j][i] = cost[i][j];
 70         }
 71     }
 72 }
 73
 74 double Prim(double r){
 75     int cnt = 1;t = 0;double c = 0,D = 0;
 76     for(int i = 1;i <= n;++i)
 77         d[i] = cost[1][i]-r*dis[1][i],from[i] = 1;
 78     d[1] = -2e9;
 79     for(int j = 1;j <= n; ++ j){
 80         double cur = 2e9;int id = 0;
 81         for(int i = 1;i <= n; ++ i){
 82             if(d[i]!=-2e9 && d[i] < cur){
 83                 cur = d[i];    id = i;
 84             }
 85         }
 86         t += cur;cnt++;d[id] = -2e9;
 87         c += cost[from[id]][id];
 88         D += dis[from[id]][id];
 89         if(cnt == n) break;
 90         for(int i = 1;i <= n; ++ i) {
 91             if(d[i] > cost[id][i]-r*dis[id][i]){
 92                 d[i] = cost[id][i]-r*dis[id][i];
 93                 from[i] = id;
 94             }
 95         }
 96     }
 97     if(t < esp) return c/D;
 98     else return -2e9;
 99 }
100
101 void work(){
102     double ans = (double)7;
103     while(1){
104         double R = Prim(ans);
105         if(R == -2e9||fabs(ans - R) <= esp) break;//fabs!!
106         //直接判断是否相等就好,r不会等于-2e9
107         ans = R;
108     }
109     printf("%.3lf\n",ans);
110 }
111
112 int main(){
113 //    file();
114     while(~scanf("%d",&n)){
115         if(!n) break;
116         size = 0;
117         readdata();
118         init();
119         work();
120     }
121     return 0;
122 }

View Code

最后偷偷放个题解

转载于:https://www.cnblogs.com/Mandy-H-Y/p/11482144.html

MZOJ #82 总统竞选相关推荐

  1. 服务过美国总统竞选的非传统投票UI [解析及DEMO]

    上篇文章和大家介绍了需求情况和难点分析,大家可以看这个链接了解详细 服务过美国总统竞选的非传统投票UI =================正文开始=========================== ...

  2. 2012美国总统竞选赞助数据分析项目学习

    项目目的:通过对2012美国总统竞选赞助数据分析,得出哪个总统更具有优势的结论 项目流程:数据载入.数据清洗.数据聚合分组以及可视化 项目地址:https://tianchi.aliyun.com/n ...

  3. 数据分析案例--2012美国总统竞选赞助数据分析

    美国总统竞选赞助数据分析 本文来自阿里云天池实验室,案例原地址 自学数据分析的小王同学借鉴一下,自己写一遍,分析一遍,自己做的代码和结果如下 1.导入相关的python数据分析的库 import pa ...

  4. pandas实战-2012美国总统竞选赞助分析

    1.数据载入和总览 1.1数据来源 数据来源于阿里云天池公共数据-pandas实践-2012美国总统竞选赞助数据分析,如图所示 然后下载数据并保存到本地,最后读取(本次操作使用工具-jupyter n ...

  5. pandas数据分析案例--2012美国总统竞选赞助数据分析

    美国总统竞选赞助数据分析 本文内容参考阿里云天池实验室,在原有基础上添加了一些结论的分析. 原案例地址 数据来源 1.首先导入相关的python数据分析的库 import pandas as pd i ...

  6. 数据分析- 2012美国总统竞选赞助数据分析

    数据分析- 2012美国总统竞选赞助数据分析 导入有关的包 1. 数据载入 1.1 数据读取 1.2 数据合并 1.3 数据基本统计分析 2. 数据清洗 2.1 缺失值处理 2.2 数据转换 2.2. ...

  7. 《人类简史》作者:到2028年,美国总统竞选可能不再由人类主持

    1."语言是人类文化的操作系统.从语言中产生了神话和法律,众神和金钱,艺术和科学,友谊和国家,以及计算机代码.人工智能对语言的掌握,意味着它现在可以入侵并操纵文明的操作系统." 2 ...

  8. 分身竞选总统?法国总统竞选这么干! 全息3d网

    编辑:大熊 [摘要]法国总统采用全息技术实现"分身"演讲,可谓是一次演讲,全面覆盖! 全息3d网讯:众所周知,欧美国家的总统是通过公开竞选得到的,所以能更直接.更广泛的近距离接触民 ...

  9. Pandas方法实践-2012美国总统竞选赞助数据分析

    目录 1. 数据载入和总览 1.1 数据载入(pd.read_csv()) 1.2 数据合并(pd.concat()) 1.3 数据预览和基本统计分析 2. 数据清洗 2.1 缺失值处理​ 2.2 数 ...

最新文章

  1. iOS 模仿微信的照片选择器
  2. 手撕一个spirng IoC的过程
  3. seajs学习心得和新产品福利
  4. Spring和MyBatis环境整合
  5. 如何安装Windows操作系统?(二)安装启动项杂谈
  6. 关于easyui的一些小知识点(1)
  7. Mac电脑 hbuilderx 运行到小程序node-sass异常
  8. SCPPO(九):性能优化之停工装置按照开工装置更新价格
  9. 在GitHub存储库中创建标记
  10. tortoiseSVN svn+ssh
  11. rust : rustup切换stable、nightly
  12. 视频编解码之理论概述
  13. MongoDB数据导入 JSON
  14. 女生学前端适合么?新人应该怎么学习?
  15. 北京最最最牛的IT公司都在这了
  16. html5是什么语言,html5 css3是什么?
  17. 转:用迅雷下载Android SDK全系列
  18. mysql创建数据库error1044_Mysql创建数据库时提示Error 1044
  19. Debian GUN/Linux Desktop grap语言配置 [大三四八九月实习]
  20. 京东店铺如何做好关联销售?

热门文章

  1. 写给新手的深度学习综述,收藏了
  2. c# datatable数据合并方法
  3. 【MobaXterm教程】【公网】利用ipv6远程访问服务器
  4. 3道题彻底搞定:套路解决递归问题
  5. csgo服务器响应参数,csgo必备弹道参数 影响弹道参数设置
  6. SQL查询(嵌套查询)
  7. 学习 《模型思维》-斯科特·佩奇 笔记 9.26
  8. 极客时间--数据结构与算法之美
  9. 使用java的milo框架访问OPCUA服务的方法
  10. arcgis desktop和arcgis engin连接postgresql数据库连接需要的类库