pid=4081">http://acm.hdu.edu.cn/showproblem.php?pid=4081

Problem Description
During the Warring States Period of ancient China(476 BC to 221 BC), there were seven kingdoms in China ---- they were Qi, Chu, Yan, Han, Zhao, Wei and Qin. Ying Zheng was the king of the kingdom Qin. Through 9 years of wars, he finally conquered all six other
kingdoms and became the first emperor of a unified China in 221 BC. That was Qin dynasty ---- the first imperial dynasty of China(not to be confused with the Qing Dynasty, the last dynasty of China). So Ying Zheng named himself "Qin Shi Huang" because "Shi
Huang" means "the first emperor" in Chinese.




Qin Shi Huang undertook gigantic projects, including the first version of the Great Wall of China, the now famous city-sized mausoleum guarded by a life-sized Terracotta Army, and a massive national road system. There is a story about the road system:

There were n cities in China and Qin Shi Huang wanted them all be connected by n-1 roads, in order that he could go to every city from the capital city Xianyang.

Although Qin Shi Huang was a tyrant, he wanted the total length of all roads to be minimum,so that the road system may not cost too many people's life. A daoshi (some kind of monk) named Xu Fu told Qin Shi Huang that he could build a road by magic and that
magic road would cost no money and no labor. But Xu Fu could only build ONE magic road for Qin Shi Huang. So Qin Shi Huang had to decide where to build the magic road. Qin Shi Huang wanted the total length of all none magic roads to be as small as possible,
but Xu Fu wanted the magic road to benefit as many people as possible ---- So Qin Shi Huang decided that the value of A/B (the ratio of A to B) must be the maximum, which A is the total population of the two cites connected by the magic road, and B is the
total length of none magic roads.

Would you help Qin Shi Huang?

A city can be considered as a point, and a road can be considered as a line segment connecting two points.
 
Input
The first line contains an integer t meaning that there are t test cases(t <= 10).

For each test case:

The first line is an integer n meaning that there are n cities(2 < n <= 1000).

Then n lines follow. Each line contains three integers X, Y and P ( 0 <= X, Y <= 1000, 0 < P < 100000). (X, Y) is the coordinate of a city and P is the population of that city.

It is guaranteed that each city has a distinct location.
 
Output
For each test case, print a line indicating the above mentioned maximum ratio A/B. The result should be rounded to 2 digits after decimal point.
 
Sample Input
2
4
1 1 20
1 2 30
200 2 80
200 1 100
3
1 1 20
1 2 30
2 2 40
 
Sample Output
65.00
70.00
 

/**
hdu4081 次小生成树变形
题目大意:给定n个城市,每一个城市有ai个人,在这些城市间修路,已知能够免费修一条路。其它路费用为长度,求免费路连接城市人口和修路总费用比值的最大值
解题思路:我们要枚举每条路作为免费路的情况。能够先求出最小生成树sum。假设枚举的边在生成树上就(ai+a[j])/(sum-该边)。假设边不在生成树上
(ai+aj)/(sum-mlen[i][j]) mlen是加上当前边到最小生成树后必定组成的环上除当前边外最大权值边的权值。事实上就是一个次小生成树求解
*/
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
const int maxn=1010;
const double inf=1e14; struct note
{
int x,y,z;
}p[maxn]; double a[maxn][maxn],dis[maxn];
int pre[maxn],n; int flag[maxn][maxn],vis[maxn];
double mlen[maxn][maxn]; double prim(int u)
{
double sum=0;
memset(flag,0,sizeof(flag));
memset(vis,0,sizeof(vis));
memset(mlen,0,sizeof(mlen));
for(int i=1; i<=n; i++)
{
dis[i]=a[u][i];
pre[i]=u;
}
vis[u]=1;
for(int i=1; i<n; i++)
{
double minn=inf;
int v=-1;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dis[j]<minn)
{
v=j;
minn=dis[j];
}
}
if(v!=-1)
{
sum+=dis[v];
flag[v][pre[v]]=flag[pre[v]][v]=1;
vis[v]=1;
for(int k=1; k<=n; k++)
{
if(vis[k]&&k!=v)
{
mlen[v][k]=mlen[k][v]=max(mlen[k][pre[v]],dis[v]);
}
if(!vis[k]&&a[v][k]<dis[k])
{
dis[k]=a[v][k];
pre[k]=v;
}
}
}
}
return sum;
} double lenth(int x,int y,int u,int v)
{
return sqrt((x-u)*(x-u)+(y-v)*(y-v));
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);
}
for(int i=1; i<= n; i++)
{
a[i][i]=0;
for(int j=i+1; j<=n; j++)
{
a[i][j]=a[j][i]=lenth(p[i].x,p[i].y,p[j].x,p[j].y);
}
}
double sum=prim(1);
double ans=-1;
for(int i=1; i<=n; i++)
{
for(int j=i+1; j<=n; j++)
{
if(flag[i][j])
ans=max(ans,(p[i].z+p[j].z)/(sum-a[i][j]));
else
ans=max(ans,(p[i].z+p[j].z)/(sum-mlen[i][j]));
}
}
printf("%.2lf\n",ans);
}
return 0;
}

hdu4081 次小生成树变形的更多相关文章

  1. HDU4081 Qin Shi Huang's National Road System —— 次小生成树变形

    题目链接:https://vjudge.net/problem/HDU-4081 Qin Shi Huang's National Road System Time Limit: 2000/1000 ...

  2. hdu4081次小生成树

    先求一遍最小生成树,然后遍历所有边,如果这条边在最小生成树中就直接减去这条边的距离,如果不在最小生成树中,那么就构成了一个环,此时需要减去最小生成树中最大的边,即求次小生成树时的maxx, 有一点要注 ...

  3. hdu4081 次小生成树

    题意:有n个点,n-1条边.现在徐福可以让一条边无消耗建立,即魔法边.B表示除魔法边之外的的其他边的消耗值和,A表示这条魔法边相连的2个集合中都选一点,这两点的最大值,现在要求A/B最大. 方法:因为 ...

  4. hdu4081 Qin Shi Huang's National Road System 次小生成树

    先发发牢骚:图论500题上说这题是最小生成树+DFS,网上搜题解也有人这么做.但是其实就是次小生成树.次小生成树完全当模版题.其中有一个小细节没注意,导致我几个小时一直在找错.有了模版要会用模版,然后 ...

  5. HDU-4081.Qinshihuang'sNationalRoadSystem(次小生成树变种)

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

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

    题意: 秦始皇要建路,一共有n个城市,建n-1条路连接. 给了n个城市的坐标和每个城市的人数. 然后建n-2条正常路和n-1条魔法路,最后求A/B的最大值. A代表所建的魔法路的连接的城市的市民的人数 ...

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

    题目大意: 有n个城市,秦始皇要修用n-1条路把它们连起来,要求从任一点出发,都可以到达其它的任意点.秦始皇希望这所有n-1条路长度之和最短.然后徐福突然有冒出来,说是他有魔法,可以不用人力.财力就变 ...

  8. POJ1679 The Unique MST[次小生成树]

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28673   Accepted: 10239 ...

  9. The Unique MST(次小生成树)

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22335   Accepted: 7922 Description Give ...

随机推荐

  1. WinCE发展史

    Windows CE概述 WindowsCE是微软公司嵌入式.移动计算平台的基础,它是一个开放的.可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设备操作系统,它是精简的Windows 95,W ...

  2. SGU 438 The Glorious Karlutka River =) ★(动态+分层网络流)

    [题意]有一条东西向流淌的河,宽为W,河中有N块石头,每块石头的坐标(Xi, Yi)和最大承受人数Ci已知.现在有M个游客在河的南岸,他们想穿越这条河流,但是每个人每次最远只能跳D米,每跳一次耗时1秒 ...

  3. Jquery拖拽原理

    /* onmousedown : 选择元素 onmousemove : 移动元素 onmouseup : 释放元素 */ 查看Demo:拖拽图片 function drag(obj) { obj.on ...

  4. Hibernate之HQL介绍

    Hibernate中提供了多种检索对象的方式,主要包括以下种类: 导航对象图检索方式:根据已经加载的对象导航到其他对象 OID检索方式:根据对象的OID来检索对象 HQL检索方式:使用面向对象的HQL ...

  5. 微信公众平台开发—利用OAuth2.0获取微信用户基本信息

    在借鉴前两篇获取微信用户基本信息的基础下,本人也总结整理了一些个人笔记:如何通过OAuth2.0获取微信用户信息 1.首先在某微信平台下配置OAuth2.0授权回调页面: 2.通过appid构造url ...

  6. Swift的字符串String是值类型

    根据<The Swift Programming Language>中文版基于Xcode6.1的文章描述: Swift的 String 类型是值类型.如果创建了新的字符串,那么当其进行常量 ...

  7. 9、四大组件之四-Broadcast Receiver

    课程目标: 了解Android消息机制 掌握Broadcast发送消息的两种类型 掌握BroadcastReceiver接收消息的编程 重点难点: sendOrderedBroadcast()的理解 ...

  8. Linux shell 获取当前时间之前N天

    date +%Y%m%d --date '2 days ago' 更多资料关注:www.kootest.com ;技术交流群:182526995

  9. 远程调试树莓PI

    非官方 参考  http://linuxtortures.blogspot.jp/2012/06/cross-compiling-and-cross-debugging-c.html 注意: 建立 / ...

  10. NOIP 2015 神奇的幻方

    模拟,注意为偶数的情况 #include<cstdio> #include<cstring> #include<cstdlib> #include<iostr ...