题意:对于已知的网络构建道路,使城市两两之间能够互相到达。其中一条道路是可以免费修建的,问需要修建的总长度B与免费修建的道路所连接的两城市的人口之和A的比值A/B最大是多少。

因为是求A/B的最大值,自然A越大,B越小越好。B的最小值是可以用最小生成树算法求解的,但是,由于免费修建一条道路,使得B值<最小生成树的权值和cnt。

于是,就要考虑究竟选择哪条边作为免费修建?只考虑生成树上的边还是全部边都要考虑?仔细想一下,就会发现任何一条边都存在这样的可能性。而A/B的值同时收A、B的影响,即B可以稍微大一点,只要A增大的倍数更大,那么A/B就会出现一个更优解。

至此,选择枚举每一条边(u,v)作为可能免费修建的边。当然,若它在最小生成树上,那么B==cnt-边权;若它不在最小生成树上,那么加上该条边相当于在树形结构上构造了一个环,那么减去环上任何一条边(当然不能是新加的这条边),又构成一棵树。当删除的是原树上u,v两点唯一路径上权值最大的一条边时,这棵树就是对应于所加的边(u,v)“次小生成树”(这里的次小不是真正的次小)。为什么一定是当前次小呢?由kruskal算法可知,这是通过贪心构造出的一棵树,新加上的边必然是环上的最大值(否则就不会是最小生成树了),而不在环上的边可以保证最小,所以通过如上构造,得到了一棵确定选择边(u,v)后的最小生成树,也是原图的一颗次小生成树(究竟是不是真的是次小,要比较完全部的“次小生成树”才能得到,并且注意次小生成树不唯一)。

用prim算法实现,记录(u,v)两两之间的路径上的最大值:每次记录即将加入生成树的点v与已加入的点之间的最大值,f[v]=max{f[u],w(u,v)},u是v的父亲。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<vector>
 5 #include<algorithm>
 6 #define clr(a,m) memset(a,m,sizeof(a))
 7 #define rep(i,a,b) for(int i=a;i<=b;i++)
 8 using namespace std;
 9
10 const int MAXN=1111;
11 const double INF =1e9;
12
13 struct Point{
14     int c;
15     double x,y;
16 }p[MAXN];
17
18 double mp[MAXN][MAXN],f[MAXN][MAXN];
19
20 double d[MAXN];
21 int vis[MAXN],fa[MAXN];
22
23 double prim(int n)
24 {
25     vector<int>q;
26     double cnt=0;
27
28     clr(vis,0);
29     rep(i,1,n)
30         d[i]=INF;
31     d[1]=0;
32     fa[1]=1;
33     rep(i,1,n){
34         int x;
35         double m=INF;
36         rep(y,1,n)
37             if(!vis[y]&&d[y]<m)
38                 m=d[x=y];
39         vis[x]=true;
40         cnt+=mp[fa[x]][x];
41
42         int sz=q.size();
43         rep(j,0,sz-1){
44             f[q[j]][x]=f[x][q[j]]=max(f[q[j]][fa[x]],mp[fa[x]][x]);
45         }
46         q.push_back(x);
47
48         rep(y,1,n)
49             if(!vis[y]&&mp[x][y]<d[y]){
50                 d[y]=mp[x][y];
51                 fa[y]=x;
52             }
53     }
54     return cnt;
55 }
56
57 void print(int n,double cnt)
58 {
59     double m=0;
60     rep(i,1,n)
61         rep(j,i+1,n){
62             double s=cnt-f[i][j];
63             double t=p[i].c+p[j].c;
64             m=max(m,t/s);
65         }
66     printf("%.2f\n",m);
67 }
68
69 int main()
70 {
71     int T,n;
72     scanf("%d",&T);
73     while(T--)
74     {
75         scanf("%d",&n);
76         rep(i,1,n)
77             scanf("%lf%lf%d",&p[i].x,&p[i].y,&p[i].c);
78         rep(i,1,n){
79             mp[i][i]=0;
80             rep(j,i+1,n)
81                 mp[i][j]=mp[j][i]=sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));
82         }
83         double cnt=prim(n);
84         print(n,cnt);
85     }
86     return 0;
87 }

View Code

转载于:https://www.cnblogs.com/zstu-abc/p/3280495.html

UVALive 5713 Qin Shi Huang's National Road System(次小生成树)相关推荐

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

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

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

    转载自http://blog.csdn.net/shuangde800 D_Double 题目: Problem Description During the Warring States Perio ...

  4. UVALive - 5713 Qin Shi Huang's National Road System

    prim + 邻接矩阵储存两点间最大距离,然后枚举即可. #include<iostream> #include<string> #include<cstdio> ...

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

    题目大意:有N个城市,现在要修建一些道路使得这些城市能互相连通,修建一条道路的权值为这两个城市之间的欧几里德距离. 现在你可以选择一条路作为特殊道路,这条道路的权值为0 假设修建道路的总权值为B,用特 ...

  6. Qin Shi Huang's National Road System HDU - 4081

    Qin Shi Huang's National Road System (HDU - 4081) 次小生成树的思想 题目描述 During the Warring States Period of ...

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

    题目链接:点击打开链接 Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Li ...

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

    Qin Shi Huang's National Road System( 次小生成树 ) During the Warring States Period of ancient China(476 ...

  9. HDU4081: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 ...

  10. Qin Shi Huang's National Road System

    Qin Shi Huang's National Road System 题目大意: Problem Description During the Warring States Period of a ...

最新文章

  1. TF之LSTM:基于Tensorflow框架采用PTB数据集建立LSTM网络的自然语言建模
  2. SSIS中循环遍历组件[Foreach Loop Container]
  3. 小程序开发学习(5)---实现天气预报小程序
  4. [React Native]高度自增长的TextInput组件
  5. python从入门到爬虫_python爬虫从入门到放弃(一)之初识爬虫
  6. 算法面试题汇总(更新中)
  7. php post json请求参数传递_php post json参数的传递和接收处理方法
  8. 都是写需求,高手和菜鸟为何差别这么大?
  9. 虚拟机机操作系统已禁用 cpu。请关闭或重置虚拟机。_黑科技教学丨Win10竟然内置了一台虚拟机?教你如何玩转它...
  10. 解决Eclipse启动Tomcat时报Error loading WebappClassLoader错误
  11. Express--socket.io使用session验证
  12. java设置请求头_前端需要知道的 HTTP 安全头配置
  13. Python数据挖掘实战——贝叶斯分类算法
  14. 【20211005】Praat 基本用法
  15. <永洪BI>慢查询记录
  16. Linux常用命令分享
  17. app支付宝支付java后台_手机APP如何接入支付宝支付(java后台)
  18. 计算圆周率可以根据公式如下:请利用Python提供的itertools模块,我们来计算这个序列的前N项和——python
  19. Python输出三角形图案
  20. 超赞 不愧是美团内部的JVM学习手册,从头到尾全是精华

热门文章

  1. 《生物化学与分子生物学》----绪论----听课笔记(一)
  2. 【神经网络】一文带你轻松解析神经网络(附实例恶搞女友)
  3. 程序人生-我已经努力了七年!!!
  4. c语言中calloc是什么意思,calloc(c语言calloc是什么意思)
  5. 海贼王剧场版:Z 剧情详解(附TS无字幕版地址)
  6. 网页视频下载mp4格式到本地
  7. 查看当前计算机CPU架构
  8. 《架构即未来》笔记1——概述全书内容
  9. ANSYS License管理器程序的步骤-Windows版
  10. 拓扑量子计算机有缺点,一个荷兰硕士生的新模型有助于描述量子计算机中的缺陷和错误...