Qin Shi Huang's National Road System

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

【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】

【Sample Output】

65.00
70.00

【题意】

秦国有n个城市构成,每个城市都有一定的人口。现在要修路,要求最终修成的路花费最少代价使得所有的城市都连通。然后修路的时候可以使用一个魔法,免去一条路的费用,最终结果要使使用了魔法的那条路两端的城市总人口数除以剩下所有路的长度最大。

【分析】
最少代价使得所有点都连通,很容易能够想到最小生成树。
从最终答案是A/B入手,要使这个结果最大,但是明显A与B的大小会互相影响,故不符合贪心的要求。所以采用的只能是枚举每一条边,在指定A的前提下,使B最小。
考虑一下删边是两种情况:
1. i,j边恰好在最小生成树上,那么直接删掉;
2. i,j边不在最小生成树上,那么要在最小生成树中找到i,j路径上最长的边删去;
由于本题完全图的特殊性,如果i,j边在最小生成树上,那么i,j边直接就是路径上的最长边了,也即问题转化为给定两个点,要求在最小生成树上找到两个点路径上最长的边。
而这恰好是求解次小生成树的方法。
 
思路:
按照次小生成树的求法,在Prim的过程中就顺便把路径上的最长边记录下来。Kruskal也可以完成,但是在记录最长边的过程中,Prim是有序扩展,故复杂度会更低。
 
 /* ***********************************************
MYID : Chen Fan
LANG : G++
PROG : 4081
************************************************ */ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <bitset> using namespace std; typedef struct pnod
{
int x,y,p;
} pnode;
pnode p[]; typedef struct nod
{
int a,b;
double c;
friend bool operator < (nod a,nod b)
{
return a.c>b.c;
}
} node; node edge[];
int start[],num[]; bool op(node a,node b)
{
if (a.a==b.a) return a.c<b.c;
else return a.a<b.a;
} node ntoh(int a,int b,double c)
{
node x;
x.a=a;
x.b=b;
x.c=c;
return x;
} double maxx[][];
bitset<> inway[]; double prim(int s,int n)
{
/**/
int list[],listail=;
list[]=s;
/**/
priority_queue<node> heap;
while (!heap.empty()) heap.pop();
bitset<> flag;
flag.reset();
flag[s]=;
double ans=;
memset(maxx,,sizeof(maxx));
for (int i=;i<num[s];i++) heap.push(edge[start[s]+i]); for (int i=;i<n;i++)
{
node now=heap.top();
heap.pop();
while (flag[now.b])
{
now=heap.top();
heap.pop();
}
/**/
for (int j=;j<=listail;j++)
{
maxx[list[j]][now.b]=max(maxx[list[j]][now.a],now.c);
maxx[now.b][list[j]]=maxx[list[j]][now.b];
}
listail++;
list[listail]=now.b;
/**/
flag[now.b]=true;
ans+=now.c;
for (int j=;j<num[now.b];j++)
if (!flag[edge[start[now.b]+j].b]) heap.push(edge[start[now.b]+j]);
} return ans;
} double getdis(int x,int y)
{
return sqrt((p[x].x-p[y].x)*(p[x].x-p[y].x)+(p[x].y-p[y].y)*(p[x].y-p[y].y));
} int main()
{
freopen("4081.txt","r",stdin); int t;
scanf("%d",&t);
for (int tt=;tt<=t;tt++)
{
int n;
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].p); int m=;
for (int i=;i<=n;i++)
{
start[i]=m+;
num[i]=n-;
for (int j=;j<=n;j++)
if (i!=j)
{
m++;
edge[m].a=i;
edge[m].b=j;
edge[m].c=getdis(i,j);
}
} double sum=prim(,n); double ma=;
for (int i=;i<=m;i++)
{
double temp=(p[edge[i].a].p+p[edge[i].b].p)/(sum-maxx[edge[i].a][edge[i].b]);
if (ma<temp) ma=temp;
} printf("%.2f\n",ma);
} return ;
}

HDU 4081 Qin Shi Huang's National Road System 次小生成树变种的更多相关文章

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

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

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

  3. HDU 4081 Qin Shi Huang's National Road System 最小生成树+倍增求LCA

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4081 Qin Shi Huang's National Road System Time Limit: ...

  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——————【次小生成树、prim】

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

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

  7. hdu 4081 Qin Shi Huang's National Road System 树的基本性质 or 次小生成树思想 难度:1

    During the Warring States Period of ancient China(476 BC to 221 BC), there were seven kingdoms in Ch ...

  8. hdu 4081 Qin Shi Huang's National Road System(次小生成树prim)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4081 题意:有n个城市,秦始皇要修用n-1条路把它们连起来,要求从任一点出发,都可以到达其它的任意点. ...

  9. HDU - 4081 Qin Shi Huang's National Road System 【次小生成树】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4081 题意 给出n个城市的坐标 以及 每个城市里面有多少人 秦始皇想造路 让每个城市都连通 (直接或者 ...

随机推荐

  1. 分页打印控制 摘自于网络:http://www.cnblogs.com/joinger/articles/1807517.html

    代码 style="page-break-after:always;"> 利用CSS控制打印 放在这里,算是一个备份 <style> @media print{ ...

  2. hash随笔

    hash属性是一个可读可写的字符串,是url的锚部分(从#开始).多用于单页面应用中,使其包含多个页面. 定位:通过id来定位 eg: <div id= "part1"> ...

  3. php des 加密类

    <?php/** *@see Yii CSecurityManager; */class Des{ public static function encrypt($data,$key){ $mo ...

  4. Tiny210编译和烧写u-boot步骤

    当有多个交叉编译器是,不方便设置环境变量时,可以在编译命令中指定交叉编译器,具体如下: make ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/ ...

  5. python 函数部分

    #初始化 def init(data): data['first']={} data['middle']={} data['last']={} #查看条件 def lookup(data,label, ...

  6. hdu 4463 Outlets(最小生成树)

    Outlets Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submi ...

  7. POJ 2084 Game of Connections(卡特兰数)

    卡特兰数源于组合数学,ACM中比较具体的使用例子有,1括号匹配的种数.2在栈中的自然数出栈的种数.3求多边形内三角形的个数.4,n个数围城圆圈,找不相交线段的个数.5给定n个数,求组成二叉树的种数…… ...

  8. PAT (Advanced Level) 1094. The Largest Generation (25)

    简单DFS. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> ...

  9. UVALive 6885 Flowery Trails

    两次SPFA #include<cstdio> #include<cstring> #include<cmath> #include<vector> # ...

  10. 【使用Itext处理PDF文档(新建PDF文件、修改PDF文件、PDF中插入图片、将PDF文件转换为图片)】

    iText简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文件转 ...