题意:

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

秦始皇想让修路的费用最少,但是徐福想要受益的人最多,所以他们经过协商,决定让 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. 什么是cookie?cookie的使用(设置,读取,删除)

    1.什么是cookie?     页面用来保存信息            比如:自动登录,记住用户名     cookie的特性           同一个网站所有页面共用一套cookie       ...

  2. js生成唯一的id

    1.生成[0,1)的随机数的Math.random Math.random().toString().replace(".", "");// 生成唯一的id 2 ...

  3. HD200703

    #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #inc ...

  4. 【Jmeter】if控制器+循环控制器+计数器,控制接口分支

    但是我不想这么做,接口只想写一次,让循环控制器和if控制器去判断接口,执行我想要的分支.这里遇到了一个问题,if控制器通过什么去判断接下来的分支?我引入了一个计数器的概念.起始值为0,每次循环加1,将 ...

  5. python实现图片隐藏信息技术

    隐秘通信的3种典型方式: ①将秘密信息隐于网络通信协议中. ②将秘密信息隐于数字签名等密码协议中 . ③将秘密信息隐于数字图像中. 第三种是利用图像或音频数据对人类感官系统的冗余. 隐藏域数字图像中的 ...

  6. [资料] Ceph存储系统,关于Redhat和Suse企业版存储知识汇总

    版权声明:很多其它内容,请关注[架构师技术联盟]公众号 https://blog.csdn.net/BtB5e6Nsu1g511Eg5XEg/article/details/81117091 wx_f ...

  7. 006-Object.assign

    一.Object.assign简要使用 是ES6新添加的接口,主要的用途是用来合并多个JavaScript的对象. Object.assign()接口可以接收多个参数,第一个参数是目标对象,后面的都是 ...

  8. vue-自定义pc端键盘-动画

    <template> <div class="keyboard"> <div class="keyboard_key"> & ...

  9. javascript封装animate动画

    面向对象式: Element.prototype.animate=animate; Element.prototype.getStyle=getStyle; function animate(json ...

  10. Exception in thread “main” java.sql.SQLException: No suitable driver

    问题背景:通过Spark SQL的jdbc去读取Oracle数据做测试,在本地的idea中没有报任务错误.但是打包到集群的时候报: Exception in thread “main” java.sq ...