题意:

秦始皇要修路使得所有的城市连起来,并且花费最少;有一个人,叫徐福,他可以修一条魔法路,不花费任何的钱与劳动力。

秦始皇想让修路的费用最少,但是徐福想要受益的人最多,所以他们经过协商,决定让 A / B 最大,A代表被魔法路连接的两个城市的人口总数,B代表修的路中非魔法路的总长度。

输出 A / B 的最大值。

思路:

A / B 最大,则A尽可能大,B尽可能小,所以首先把MST求出来。由于每个城市的人口有很大的偏差,所以必须枚举每一条边,计算连接的两个城市的人口,复杂度为O(n^2),所以每次替换边的复杂度必须是O(1)。

由于是稠密图,所以用prim算法,prim算法在O(n^2)的复杂度的时候,可以维护最小生成树上两点之间的最长边,这样就可以在过程中把两点间的最长边保存下来。这个是依靠已知的前驱节点实现的。复杂度为O(n^2)。

枚举每一条边时,如果这条边是MST中的边,那么就直接计算 A / B;如果这条边不在MST中,加入这条边就会成环,这时我们保存的信息就起作用了,成环之后把在MST中的连接这两点的最长边去掉,就是新的生成树的权值,且保证了B尽可能小。替换的时间复杂度为O(1)。

代码:

 #include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <math.h>
using namespace std;
const int maxn = ;
double path[maxn][maxn];
double g[maxn][maxn];
double dis[maxn];
bool vis[maxn];
bool used[maxn][maxn];
int peo[maxn];
int pre[maxn];
double ans;
struct point
{
int x,y;
}p[maxn]; double cal(int i,int j)
{
double x2 = (p[i].x - p[j].x) * (p[i].x - p[j].x);
double y2 = (p[i].y - p[j].y) * (p[i].y - p[j].y); return sqrt(x2 + y2);
} int prim(int n)
{
memset(vis,,sizeof(vis));
memset(path,,sizeof(path));
memset(used,,sizeof(used));
for (int i = ;i <= n;i++) dis[i] = 1e15; vis[] = ;
dis[] = ; int tot = ;
ans = ;
//double len = 0; for (int i = ;i <= n;i++)
{
pre[i] = ;
dis[i] = g[][i];
} for (int i = ;i < n;i++)
{
int u;
double d = 1e15; for (int j = ;j <= n;j++)
{
if (!vis[j] && dis[j] < d)
{
d = dis[j];
u = j;
}
} vis[u] = ; ans += d; //tot = max(peo[u] + peo[pre[u]],tot); used[u][pre[u]] = used[pre[u]][u] = ; for (int j = ;j <= n;j++)
{
if (vis[j] && j != u)
path[u][j] = path[j][u] = max(d,path[j][pre[u]]);
} for (int j = ;j <= n;j++)
{
if (!vis[j])
{
if (g[u][j] < dis[j])
{
dis[j] = g[u][j];
pre[j] = u;
}
}
}
} //printf("%.2f **\n",ans); return tot;
} int main()
{
int t; scanf("%d",&t); while (t--)
{
int n; scanf("%d",&n); for (int i = ;i <= n;i++)
{
scanf("%d%d%d",&p[i].x,&p[i].y,&peo[i]);
} for (int i = ;i <= n;i++)
{
for (int j = ;j <= n;j++)
{
g[i][j] = 1e15;
}
} for (int i = ;i <= n;i++)
{
for (int j = i+;j <= n;j++)
{
g[i][j] = g[j][i] = cal(i,j);
}
} prim(n); double ans1 = ; for (int i = ;i <= n;i++)
{
for (int j = i + ;j <= n;j++)
{
if (used[i][j])
{
int peop = peo[i] + peo[j];
ans1 = max(peop / (ans - g[i][j]),ans1); //printf("%d %d %d %.2f **\n",i,j,peop,ans - g[i][j]);
}
else
{
int peop = peo[i] + peo[j];
ans1 = max(peop / (ans - path[i][j]),ans1);
//printf("%d %d %d %.2f **\n",i,j,peop,ans - path[i][j]);
}
}
} printf("%.2f\n",ans1); //printf("%.2f",path[1][4]);
} return ;
}

uvalive 5731 Qin Shi Huang’s National Road System的更多相关文章

  1. UValive 5713 Qin Shi Huang's National Road System

    Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3 ...

  2. UVALive 5713 Qin Shi Huang's National Road System秦始皇修路(MST,最小瓶颈路)

    题意: 秦始皇要在n个城市之间修路,而徐福声可以用法术位秦始皇免费修1条路,每个城市还有人口数,现要求徐福声所修之路的两城市的人口数之和A尽量大,而使n个城市互通需要修的路长B尽量短,从而使得A/B最 ...

  3. UVALive 5713 Qin Shi Huang's National Road System(次小生成树)

    题意:对于已知的网络构建道路,使城市两两之间能够互相到达.其中一条道路是可以免费修建的,问需要修建的总长度B与免费修建的道路所连接的两城市的人口之和A的比值A/B最大是多少. 因为是求A/B的最大值, ...

  4. hdu 4081 Qin Shi Huang's National Road System (次小生成树)

    Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3 ...

  5. hdu 4081 Qin Shi Huang's National Road System (次小生成树的变形)

    题目:Qin Shi Huang's National Road System Qin Shi Huang's National Road System Time Limit: 2000/1000 M ...

  6. HDU 4081 Qin Shi Huang's National Road System 次小生成树变种

    Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3 ...

  7. Qin Shi Huang's National Road System HDU - 4081(树形dp+最小生成树)

    Qin Shi Huang's National Road System HDU - 4081 感觉这道题和hdu4756很像... 求最小生成树里面删去一边E1 再加一边E2 求该边两顶点权值和除以 ...

  8. [hdu P4081] Qin Shi Huang’s National Road System

    [hdu P4081] Qin Shi Huang’s National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Li ...

  9. HDU4081 Qin Shi Huang's National Road System 2017-05-10 23:16 41人阅读 评论(0) 收藏

    Qin Shi Huang's National Road System                                                                 ...

随机推荐

  1. Django实现邮件发送功能

    首先申请邮箱并在设置中申请到授权码,授权码的目的仅仅是让你有权限发邮件,但是不能登录到邮箱进行修改,发送邮件时,可以代替密码 1,配置文件settings.py #邮件服务配置文件 EMAIL_USE ...

  2. django--验证码功能实现

    首先建立验证码的视图函数1需要安装pillow库 #导入绘图库 from PIL import ImageDraw #导入绘图字体库 from PIL import ImageFont #导入图片库 ...

  3. 【Python基础】json.dumps()和json.loads()、json.dump()和json.load()的区分

    json文件处理涉及的四个函数json.dumps()和json.loads().json.dump()和json.load()的区分 一.概念理解 1.json.dumps()和json.loads ...

  4. 关于WARN Dispatcher:68 - Could not find action or result报错

    出现这个错 00:03:37,142 WARN Dispatcher:68 - Could not find action or result: /crm/linkMan_addLinkMan.act ...

  5. 8-GPIO复用

    8-GPIO引脚复用与重映射 0.通用GPIO 在复位期间及复位刚刚完成后,复用功能尚未激活,I/O 端口被配置为输入浮空模式. 复位后,调试引脚处于复用功能上拉/下拉状态: ● PA15:JTDI ...

  6. 什么是Docker?(一)

    Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 ...

  7. 前端 HTML 标签分类

    三种: 1.块级标签: 独占一行,可设置宽度,高度.如果设置了宽度和高度,则就是当前的宽高.如果宽度和高度没有设置,宽度是父盒子的宽度,高度根据内容填充. 2.行内标签:在一行内显示,不能设置宽度,高 ...

  8. 教你一步步composer安装Magento2.3

    以前外贸建站一直用zencart,这段时间ytkah比较有时间,就决定用magento来创建一下站点.magento不像普通的程序一样下载就可以直接安装,需要借助composer安装,还没没compo ...

  9. vue中根据当前时间进行排序

    computed: { newdataList: function() { return this.sortKey(this.dataList, "addtime"); } }, ...

  10. 阿里云ECS利用密钥对ssh登录服务器

    https://blog.csdn.net/u012865381/article/details/78521087/ 1.在服务机上操作创建要远程登录的用户和密码 [root@izwz97s23bov ...