最小生成树求最大比率 UVALive - 5713
题目链接:https://vjudge.net/problem/UVALive-5713
题意:给出t组数据,每组数据第一行给出一个n,表示点的数量,接下来n行,每行有三个数字,分别是点的坐标x,y和点的值w。现在我们要用n-1条边来连接这n个点,秦始皇希望这n-1条边的权值之和最小,现在徐福说他可以让其中一条边的权值为0,但是他希望这条边所连接的两点的值之和最大,所以秦始皇决定使A/B的值最大,其中,A是徐福选择的那条边所连接两点的值的和,B是除徐福选择的边之外,其他n-2条边的权值之和,输出最大的A/B。
以下内容是书上面看的。
思路:要使A/B最大,所以A要尽量大,B要尽量小。我们先让B尽量小,所以我们先求出最小生成树的权值之和假设是sum,那么我们只要枚举最小生成树的每一条边,把这条边去掉,假设这条边权值是s,让它变成两棵树,分别在两颗树里面找到值最大的点(假设两个点的值分别是a,b),结果就是max{(a+b)*1.0/(sum-s)}。
对于sum,我们用prime算法计算出来,同时记录每个点的前驱,然后枚举我们所要去掉的边的时候,我们可以用dfs标记,把最小生成树分成两颗树。
看代码吧:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<set>
#include<cstdio>
#include<string>
#include<deque>
using namespace std;
typedef long long LL;
#define eps 1e-8
#define INF 0x3f3f3f3f
#define maxn 1005
int n,m,k,t;
double map[maxn][maxn],dis[maxn];
int pre[maxn];
double sum;
int vis[maxn];
struct node{
double x,y;
int w;
}point[maxn];
double cal_dis(int i,int j){//计算两点距离
return sqrt(1.0*(point[i].x-point[j].x)*(point[i].x-point[j].x)+(point[i].y-point[j].y)*(point[i].y-point[j].y));
}
void prime(){
memset(vis,,sizeof(vis));
memset(pre,,sizeof(pre));
for(int i=;i<=n;i++)
dis[i]=INF;
dis[]=;
sum=;
for(int i=;i<=n;i++){
double min1=INF;
int u;
for(int j=;j<=n;j++){
if(!vis[j]&&dis[j]<min1){
min1=dis[j];
u=j;
}
}
if(min1==INF)
return;
vis[u]=;
sum+=min1;
for(int j=;j<=n;j++){
if(!vis[j]&&map[u][j]<dis[j]){
dis[j]=map[u][j];
pre[j]=u;//记录点j的前驱
}
}
}
}
void DFS(int u){
vis[u]=;
for(int i=;i<=n;i++){
if(!vis[i]&&pre[i]==u)
DFS(i);
}
}
double solve(){
double ans=;
for(int i=;i<=n;i++){
if(pre[i]==)//我们选择连接点i和点i的前驱的这条边,如果点i没有前驱continue
continue;
memset(vis,,sizeof(vis));
DFS(i);//标记以点i根节点的树(标记为1)
double s=map[i][pre[i]];//记录去掉的这条边的权值
int a=,b=;
for(int j=;j<=n;j++){
if(vis[j])//属于以点i为根的树
a=max(a,point[j].w);
else//属于以点pre[i]为根的树
b=max(b,point[j].w);
}
ans=max(ans,(a+b)*1.0/(sum-s));
}
return ans;
}
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lf%lf%d",&point[i].x,&point[i].y,&point[i].w);
memset(map,,sizeof(map));
for(int i=;i<n;i++){
for(int j=i+;j<=n;j++){
map[i][j]=map[j][i]=cal_dis(i,j);
}
}
prime();
printf("%.2lf\n",solve());
}
return ;
}
最小生成树求最大比率 UVALive - 5713的更多相关文章
- 训练指南 UVALive - 5713(最小生成树 + 次小生成树)
layout: post title: 训练指南 UVALive - 5713(最小生成树 + 次小生成树) author: "luowentaoaa" catalog: true ...
- UVALive - 5713 最小生成树
题意: 秦始皇修路,已知n个城市的坐标以及该城市的人口数,修路的费用是两个城市之间的欧几里得距离,其中可以有一条路不用花费代价但是要求这条路连接的两个城市的人口之和A/B尽量大,其中B是修路的总费用. ...
- UVALive 5713 Qin Shi Huang's National Road System秦始皇修路(MST,最小瓶颈路)
题意: 秦始皇要在n个城市之间修路,而徐福声可以用法术位秦始皇免费修1条路,每个城市还有人口数,现要求徐福声所修之路的两城市的人口数之和A尽量大,而使n个城市互通需要修的路长B尽量短,从而使得A/B最 ...
- UVALive 5713 Qin Shi Huang's National Road System(次小生成树)
题意:对于已知的网络构建道路,使城市两两之间能够互相到达.其中一条道路是可以免费修建的,问需要修建的总长度B与免费修建的道路所连接的两城市的人口之和A的比值A/B最大是多少. 因为是求A/B的最大值, ...
- 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 ...
- POJ 2349 Arctic Network(最小生成树+求第k大边)
题目链接:http://poj.org/problem?id=2349 题目大意:有n个前哨,和s个卫星通讯装置,任何两个装了卫星通讯装置的前哨都可以通过卫星进行通信,而不管他们的位置. 否则,只有两 ...
- 最小生成树 --- 求最小权值、MST
Agri-Net Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 37109 Accepted: 14982 Descri ...
- 求最小生成树(暴力法,prim,prim的堆优化,kruskal)
求最小生成树(暴力法,prim,prim的堆优化,kruskal) 5 71 2 22 5 21 3 41 4 73 4 12 3 13 5 6 我们采用的是dfs的回溯暴力,所以对于如下图,只能搜索 ...
- poj 2728 Desert King(最小比率生成树,迭代法)
引用别人的解释: 题意:有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一条路即可, 建造水管距离为坐标之间的欧几里德距离(好象是叫欧几里德距离吧),费用为海拔之差 现在要求 ...
随机推荐
- tomcat8.5配置redis实现session共享(tomcat-redis-session-manager-master)
1.将下面几个jar包依赖放到tomcat的lib目录下: 2.修改tomcat/conf下context.xml文件,在<Context>节点添加如下代码: <Valve clas ...
- 前端基础----CSS语法、CSS四种引入方式、CSS选择器、CSS属性操作
一.CSS语法 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. 例如: h1 {color:red; font-size:14px;} 二.CSS四种引入方式 1,行内式 行内式是在标 ...
- java多线程同步器
Java中多线程开发时,离不开线程的分工协作,常用的多线程的同步器有如下几种: 1.CountDownLatch 应用场景:等待一组线程任务完成后在继续执行当前线程. 用法:定义一个CountDown ...
- 东芝 B-EV4 打印机 串口打印命令
最近在做项目时候使用了东芝的B-EV4打印机,在打印Excel时候由于字体太小,导致打印非常模糊.只能通过串口名称发送打印指令进行打印.在做项目的时候查了很多关于B-EV4打印机的资料,和打印命令.资 ...
- Postgresql导出数据报版本不对
zabbix使用得数据库是Postgresql,最近zabbix4.0版本出来了,准备把zabbix升级,得先把数据库备份,但是一直报错,如下: 查找服务器上是否有10的版本,也一直没找到 ...
- chrome's developer console
原文链接: https://medium.freecodecamp.org/10-tips-to-maximize-your-javascript-debugging-experience-b69a7 ...
- python import引入不同路径下的模块
转载 python 包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径. 下面将具体介绍几种常用情况: (1)主程序与模块程序在同一目录下: 如下面程序结构: `- ...
- [蓝桥杯]ALGO-185.算法训练_Trash Removal
题目描述: 代码如下: #include <algorithm> #include <cstdio> #include <cstdlib> #include < ...
- bzoj5048: 塌陷的牧场
Description 农夫小Q将他的奶牛们饲养在一个长n宽m的矩形网格牧场中.行从上到下依次编号为1到n,列从左往右依次编号为1 到m.为了防止奶牛们逃跑,小Q在牧场外圈安装了一排电网,只要奶牛走出 ...
- 3076: 神经网络(bfs和拓扑排序)
3076: 神经网络 时间限制: 1 Sec 内存限制: 125 MB提交: 7 解决: 5[提交][状态][讨论版][命题人:外部导入][Edit] [TestData] [同步数据] 题目描述 ...