题意:

秦朝有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. vs2013 update 2 cordova(phonegap) 环境

    1.win8.1(需激活) 2.vs2013 update 2 http://www.microsoft.com/zh-cn/download/details.aspx?id=42665  安装说明里 ...

  2. javascript Function类型

    Function(函数)类型实际上是对象,每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法,由于函数是对象,因此函数名实际上也是一个指向函数对象的指针 声明方式 func ...

  3. JavaScript pop()函数弹出数组最后数据

    改变数组中数据的另一种方法是用 .pop() 函数. .pop() 函数用来“抛出”一个数组末尾的值.我们可以把这个“抛出”的值赋给一个变量存储起来. 数组中任何类型的数据条目(数值,字符串,甚至是数 ...

  4. [日常] 编写HTTP接口文档

    一.什么是接口文档?在项目开发中,web项目的前后端分离开发,APP开发,需要由前后端工程师共同定义接口,编写接口文档,之后大家都根据这个接口文档进行开发,到项目结束前都要一直维护.二.为什么要写接口 ...

  5. Java基础教程(19)--Object类

      Object类位于类结构树的最顶端,所有的类都是它的直接或间接子类,因此所有的类都继承了Object类的方法,我们可以在需要的时候覆盖这些方法.下面是一些将会在本文中讨论的Object类的方法: ...

  6. CentOS 7 隐藏任务栏和顶栏

    我使用的是Gnome,对于使用惯了windows的我来说,这个界面确实有点丑,但是,也将就着用了,最近发现有一款软件(Cairo-Dock)可以美化桌面,于是就安装了,但是安装之后发现了一个问题:原来 ...

  7. :after伪类+content内容生成经典应用举例——张鑫旭

    一.简单说说content内容生成 content内容生成就是通过content属性生成内容,content属性早在CSS2.1的时候就被引入了,可以使用:before以及:after伪元素生成内容. ...

  8. gulp实用配置(1)——demo

    在React和Vue推进下,现在很多人都在使用webpack作为自动化构建工具,但其实在很多时候我们并不是一定需要用到它,gulp这样的轻量级构建工具就足够了. 最近一段时间不是太忙,所以就写了三份配 ...

  9. cordova打包安卓或IOS应用

    1,先搞个java jdk.我先用的1.7版本的,用cordova打包的时候各种报错,应该是向下不兼容吧.又换了个1.8版本.装jdk一定要注意jdk跟jre不能都装在目标文件夹的根目录下,jdk跟j ...

  10. C# 生成缩略图 去除图片旋转角度

    图片生成缩略图会有旋转角度 /// <summary> /// 测试JRE图片压缩后图片会旋转问题 /// </summary> public void Uploadimg1( ...