题意:

秦朝有n个城市,需要修路让每个城市都互相连通,现在可以免费修一条路,秦始皇希望他除了这条免费修的路外所需修的路的总和B最短,同时这条免费的路连接的人口之和A尽可能大,求最大的A/B是多少,城市之间的长度为欧几里得距离

思路:

这题是一个典型的最小生成树的题目。首先应该先求出最小生成树,其权值之和为W,然后再根据MST的回路性质,算出每一条路径对应的最大边权值,再进行遍历,求出最大的A/B即可

代码有参考这里

AC代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <queue>
#include <map>
#include <vector>
#include <algorithm>
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long ll;
const int maxn=; struct Edge
{
int a,b;
double d;
bool operator < (const Edge& rhs) const
{
return d < rhs.d;
}
}; int x[maxn];
int y[maxn];
int p[maxn];
int n;
Edge e[maxn*maxn]; //G是与该节点相连的节点的编号,C是相应的cost
vector<int> G[maxn];
vector<double> C[maxn]; int par[maxn]; void init(){
for(int i=;i<n;i++){
par[i]=i;
G[i].clear();
C[i].clear();
}
} //int find(int x){return x==find(x)?x:par[x]=find(par[x]);} int find(int x)
{
if(x!=par[x])
par[x] = find(par[x]);
return par[x];
} bool unite(int x,int y){
x=find(x);
y=find(y);
if(x==y){
return false;
}else{
par[x]=y;
return true;
}
} double mst(){
int cnt=;
for(int i=;i<n;i++){
for(int j=i+;j<n;j++){
e[cnt].a=i;
e[cnt].b=j;
e[cnt].d=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
cnt++;
}
}
// cout<<"ss"<<endl;
sort(e,e+cnt);
init();
for(int i=; i<n; i++)
{
par[i] = i;
G[i].clear();
C[i].clear();
}
double ans=;
int cnt2=;
// cout<<"aa"<<endl;
for(int i=;i<cnt;i++){
if(unite(e[i].a,e[i].b)){
G[e[i].a].push_back(e[i].b);
C[e[i].a].push_back(e[i].d);
G[e[i].b].push_back(e[i].a);
C[e[i].b].push_back(e[i].d);
ans+=e[i].d;
cnt2++;
if(cnt2==n-) break;
}
} // cout<<ans<<endl;
return ans;
} double costs[maxn][maxn];
vector<int> nodes; //u是现在在搜索的节点,fa是u的父节点(从哪来),facost是之前来的那条路的cost
void dfs(int u, int fa, double facost)
{
for(int i = ; i < nodes.size(); i++)
{
int x = nodes[i];
costs[u][x] = costs[x][u] = max(costs[x][fa], facost);
}
nodes.push_back(u);
for(int i = ; i < G[u].size(); i++)
{
int v = G[u][i];
if(v != fa)
dfs(v, u, C[u][i]);
}
} int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d%d%d",&x[i],&y[i],&p[i]);
}
// cout<<"hh"<<endl;
double total=mst();
memset(costs,,sizeof(costs));
nodes.clear();
dfs(, -, ); double ans = -; for(int i=; i<n; i++)
{
for(int j=i+; j<n; j++)
{
ans = max(ans,(p[i]+p[j])/(total-costs[i][j]));
}
}
printf("%.2lf\n",ans); }
return ;
}

LA5713 秦始皇修路 (mst)的更多相关文章

  1. LA 5713 秦始皇修路 MST

    题目链接:http://vjudge.net/contest/144221#problem/A 题意: 秦朝有n个城市,需要修建一些道路使得任意两个城市之间都可以连通.道士徐福声称他可以用法术修路,不 ...

  2. hdu4081 秦始皇修路(次小生成树)

    题目ID:hdu4081   秦始皇修路 题目链接:点击打开链接 题目大意:给你若干个坐标,每个坐标表示一个城市,每个城市有若干个人,现在要修路,即建一个生成树,然后有一个魔法师可以免费造路(不消耗人 ...

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

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

  4. LA 5713 秦始皇修路

    https://vjudge.net/problem/UVALive-5713 题意: 秦朝有n个城市,需要修建一些道路使得任意两个城市之间都可以连通.道士徐福声称他可以用法术修路,不花钱,也不用劳动 ...

  5. 【最小生成树】UVA1494Qin Shi Huang's National Road System秦始皇修路

    Description During the Warring States Period of ancient China(476 BC to 221 BC), there were seven ki ...

  6. 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 ...

  7. UVALive - 5713 最小生成树

    题意: 秦始皇修路,已知n个城市的坐标以及该城市的人口数,修路的费用是两个城市之间的欧几里得距离,其中可以有一条路不用花费代价但是要求这条路连接的两个城市的人口之和A/B尽量大,其中B是修路的总费用. ...

  8. LA5713 Qin Shi Huang's National Road System

    题目大意:秦始皇要在n个城市之间修筑一条道路使得任意两个城市均可连通.有个道士可以用法力帮忙修一条路.秦始皇希望其他的道路总长B最短且用法术连接的两个城市的人口之和A尽量大,因此下令寻找一个A / B ...

  9. 【LA 5713 】 Qin Shi Huang's National Road System (MST)

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

随机推荐

  1. css3 animation(动画)笔记

    在开始介绍Animation之前我们有必要先来了解一个特殊的东西,那就是"Keyframes",我们把他叫做“关键帧”,玩过flash的朋友可能对这个东西并不会陌生.下面我们就一起 ...

  2. Go 中包导入声明

    Go中的程序由软件包组成.通常,软件包依赖于其他软件包,或者内置于标准库或第三方的软件包.包需要先导入才能使用其导出的标识符.本文将翻译一篇国外的文章,用于介绍包导入的原理以及几种常用的导入方式. & ...

  3. Element ui 中使用table组件实现分页记忆选中

    我们再用vue和element-ui,或者其他的表格的时候,可能需要能记忆翻页勾选,那么实现以下几个方法就ok了 示例如下 <el-table :data="tableData&quo ...

  4. 基于Vue实现图片在指定区域内移动

    当图片比要显示的区域大时,需要将多余的部分隐藏掉,我们可以通过绝对定位来实现,并通过动态修改图片的left值和top值从而实现图片的移动.具体实现效果如下图,如果我们移动的是div 实现思路相仿. 此 ...

  5. 前端微信小程序实战篇

    电商底部导航栏的制作 我想大家对电商一定不陌生,一般电商的底部导航栏有以下几个首页.分类.购物车.个人中心. app.json是用来配置page路径以及导航栏属性的,那我们要做首页.分类.购物车.个人 ...

  6. vmware参数详解

    config.ini - 设置 VMX文件参数 文件configs.ini或config(在Linux中)为所有用户设置参数,或者如果您喜欢 - 为主机设置参数. 如果要为所创建的所有虚拟机使用某些设 ...

  7. CRM系统新思维

    客户关系管理系统(CRM系统)是管理公司当前以及未来潜在客户的系统,其主要目的是通过优化客户关系实现公司销售业绩的长期增长,它是企业信息系统的核心之一.目前,移动互联网.大数据以及人工智能技术发展日新 ...

  8. Dialog向Activity传递数据

    PopupDialog中声明一个内部接口PriorityListener,接口中声明一个回调函数refreshPriorityUI,用于在 Dialog的监听事件触发后刷新Activity的UI显示. ...

  9. Transformation functionality for the String class

    String类的转换功能: package com.itheima_05; /* * String类的转换功能: * char[] toCharArray():把字符串转换为字符数组 * String ...

  10. android 自定义控件之ViewGroup生命周期执行步骤

    前言 了解ViewGroup的生命周期的执行步骤对于自己自定义ViewGroup的时候十分重要,清楚了整个流程才能对ViewGroup有更深的理解.本文从个人的总结,来阐述一下执行的顺序.执行说明 首 ...