1.其中:枚举每条不在最小生成树上的边,并把这条边放到最小生成树上面,然后就一定形成环,那么我们将这条环中取出最长的一条路。最终我们得到的权值便是最小生成树的权值。
Max[i][j]表示的最小生成树中的点i到点j之间的最长距离。Max[u][j]=max(Max[j][p[u]],dist[u]);used[t][p[t]]=used[p[t]][t]表示记录是最小生成树的边;p[t]记录前驱节点。
2.(两个城市人口/(生成树长度-这条路的长度))其中这个有两种情况:
(1).当这条边就是最小生成树中的边时,减去这条边;
(2).当这条边是次小生成树中的边时,也就是最大边权值Max[i][j]。

方法一:Prim()
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iomanip>
using namespace std;
const int maxx=1005;
const int inf=0x3f3f3f3f;
double e[maxx][maxx];
double dist[maxx];
int p[maxx];
int n,m;
int used[maxx][maxx];
double Max[maxx][maxx];
int vis[maxx];
struct node{int x,y;int n;
}num[maxx];
double dists(node a,node b){double x=(double)(a.x-b.x);double y=(double)(a.y-b.y);return (double)sqrt(x*x+y*y);
}
double Prim(){double mincost=0;memset(vis,0,sizeof(vis));memset(used,0,sizeof(used));for(int i=1;i<=n;i++){dist[i]=e[1][i];p[i]=1;}vis[1]=1;dist[1]=0;for(int i=1;i<n;i++){double temp=inf;int t=1;for(int j=1;j<=n;j++){if(!vis[j]&&dist[j]<temp){temp=dist[j];t=j;}}if(t==1)break;vis[t]=1;mincost+=dist[t];used[t][p[t]]=used[p[t]][t]=1;Max[t][p[t]]=Max[p[t]][t]=temp;for(int j=1;j<=n;j++){if(vis[j]&&j!=t){Max[j][t]=Max[t][j]=max(Max[j][p[t]],dist[t]);}if(e[t][j]<inf){if(!vis[j]&&dist[j]>e[t][j]){dist[j]=e[t][j];p[j]=t;}}}}return mincost;
}
double second_prim(int n,double mincost){double ans=0;for(int i=1;i<=n;i++){for(int j=1+i;j<=n;j++){if(i!=j){if(!used[i][j]&&e[i][j]!=inf){ans=max(ans,(num[i].n*1.0+num[j].n*1.0)/(mincost-Max[i][j]));}else if(used[i][j]&&e[i][j]!=inf){ans=max(ans,(num[i].n*1.0+num[j].n*1.0)/(mincost-e[i][j]));}} }}return ans;
}
int main(){int t;scanf("%d",&t);while(t--){scanf("%d",&n);memset(Max,0,sizeof(Max));for(int i=1;i<=n;i++){scanf("%d %d %d",&num[i].x,&num[i].y,&num[i].n);}for(int i=0;i<=n;i++){dist[i]=inf;for(int j=0;j<=n;j++){if(i==j){e[i][j]=0;}else{e[i][j]=inf;}}}for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){e[i][j]=e[j][i]=dists(num[i],num[j]);}}double mincost=Prim();double maxweight=second_prim(n,mincost);cout<<setiosflags(ios::fixed)<<setprecision(2)<<maxweight<<endl;}return 0;
}
方法二:Kruskal()-超时
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<iomanip>
using namespace std;
const int maxx=105;
const int inf=0x3f3f3f3f;
int pre[maxx];
int ranks[maxx];
int vis[maxx];
int n,m;
int used[maxx][maxx];
double Max[maxx][maxx];
vector<int>G[maxx];
struct point{int x,y;int p;
}ax[maxx];
struct node{int u,v;double w;int vis;node(){};node(int u,int v,double w,int vis):u(u),v(v),w(w),vis(vis){}
};
node num[maxx];
double dist(point a,point b){double x=(double)(a.x-b.x);double y=(double)(a.y-b.y);return sqrt(x*x+y*y);
}
int cmp(node a,node b){return a.w<b.w;
}
void init(int n){for(int i=1;i<=n;i++){pre[i]=i;ranks[i]=0;num[i].vis=0;G[i].push_back(i);}
}
int find(int x){int r=x;if(pre[x]==r){return x;}return pre[x]=find(pre[x]);
}double Kruskal(int m){double mincost=0;int cnt=0;for(int k=1;k<=m;k++){int fx=find(num[k].u);int fy=find(num[k].v);if(fx!=fy){cnt++;pre[fx]=fy;mincost+=num[k].w;num[k].vis=1; int len_x=G[fx].size();int len_y=G[fy].size();for(int i=0;i<len_x;i++){for(int j=0;j<len_y;j++){Max[G[fx][i]][G[fy][j]]=Max[G[fy][j]][G[fx][i]]=num[k].w;}}for(int i=0;i<len_y;i++){G[fx].push_back(G[fy][i]);}if(cnt==n-1)break;}}return mincost;
}
double second_min(double mincost,int m){double ans=0;for(int i=1;i<=m;i++){if(!num[i].vis){ans=max(ans,(ax[num[i].u].p+ax[num[i].v].p)*1.0/(mincost-Max[num[i].u][num[i].v]));}else{ans=max(ans,(ax[num[i].u].p+ax[num[i].v].p)*1.0/(mincost-num[i].w));}}return ans;
}
int main(){int t;scanf("%d",&t);while(t--){scanf("%d",&n);for(int i=1;i<=n;i++)G[i].clear();init(n);for(int i=1;i<=n;i++){scanf("%d %d %d",&ax[i].x,&ax[i].y,&ax[i].p);}m=0;for(int i=1;i<=n;i++){for(int j=1+i;j<=n;j++){double cost=dist(ax[i],ax[j]);num[++m]=node(i,j,cost,0);}}sort(num+1,num+m+1,cmp);double mincost=0;mincost=Kruskal(m);double ans=second_min(mincost,m);cout<<setiosflags(ios::fixed)<<setprecision(2)<<ans<<endl;}return 0;
}

HDU4081(次小生成树)相关推荐

  1. HDU-4081 Qin Shi Huang's Road 8ystem(次小生成树)

    题目链接 原标题:Qin Shi Huang's National Road System CSDN把System设置成非法字符? 题意 NNN个城市每个城市有一定的人口,秦始皇要修地铁了.他的手下运 ...

  2. kuangbin专题八 HDU4081 Qin Shi Huang's National Road System(次小生成树)

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

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

  4. poj 1679 次小生成树

    次小生成树的求法: 1.Prime法 定义一个二维数组F[i][j]表示点i到点j在最小生成树中的路径上的最大权值.有个知识就是将一条不在最小生成树中的边Edge加入最小生成树时,树中要去掉的边就是E ...

  5. 模板 - LCA最近公共祖先(倍增法、Tarjan、树上差分、LCA优化的次小生成树)

    整理的算法模板合集: ACM模板 注意x和y的LCA可以是x或者y本身 一.LCA的在线倍增算法 /*给定一棵包含 n个节点的有根无向树,有 m个询问,每个询问 给出了一对节点的编号 x和 y,询问 ...

  6. 解题报告:luogu P4180 [BJWC2010]严格次小生成树(次小生成树、倍增LCA优化、O(mlogn) )

    P4180 [BJWC2010]严格次小生成树 次小生成树有两种,一种是不严格次小生成树,也就是可以数值上等于最小生成树,一种是严格次小生成树,是权值严格大于最小生成树,两种求法大同小异. 方法2在严 ...

  7. 最小生成树(kruskal、prim、最小生成森林问题、严格次小生成树)

    整理的算法模板合集: ACM模板 目录 一.kruskal算法 二.prim算法 三.Boruvka算法 四.生成森林问题(K颗树) 五.最小生成树的唯一性 六.严格次小生成树 LCA优化的次小生成树 ...

  8. 一棵树的生成树有几颗_次小生成树(树剖,生成树)

    生成树的概念: 在一个无向图中,设顶点数为\(n\),取其中\(n-1\)条边并使所有点相连,所得到的一棵树即为生成树. 最小生成树: 如果还没有接触过生成树的同学,欢迎戳->最小生成树详解 次 ...

  9. 次小生成树(Prim + Kruaskal)

    问题引入: 我们先来回想一下生成树是如何定义的,生成树就是用n - 1条边将图中的所有n个顶点都连通为一个连通分量,这样的边连成子树称为生成树. 最小生成树很明显就是生成树中权值最小的生成树,那么我们 ...

最新文章

  1. Win2003下Asp配置技巧 http 500内部服务器错误
  2. 开发无框架单页面应用 — 老码农的祖传秘方
  3. OM(OPEN-MALL) 项目致力于打造分布式开源电商平台
  4. 服务器操作系统类型怎么查,服务器查看操作系统类型
  5. jar包上传到jcenter
  6. 清华自主招生复试,南大综合评价录取,全都考了人工智能
  7. 深入HashCode方法
  8. apache2 wordpress目录权限_Linux下WordPress建站步骤
  9. 上海名媛 -- 精致女孩的打拼生活
  10. 安装mysql过程中出现无法找到入口,无法定位程序输入点fesetround于动态链接库
  11. java.util.Date中的loe_有趣的widget-日期和时间
  12. 文字添加横线的h5实现
  13. 产品经理求职方法指南:面试通关
  14. 在Nignx增加http2模块顺便聊聊HTTP的八卦
  15. 强化学习系列(五):蒙特卡罗方法(Monte Carlo)
  16. 华为 博士 实习_如何看待华为招聘生物博士实习生?
  17. 微商软文标题怎么写才吸引人?
  18. ID card No.
  19. 2.3.1 通货膨胀的季节调整与预测模型(pythonR代码复现)
  20. 【数据结构实验】链表的创建与功能的实现

热门文章

  1. 绝望,上传文件失败。。遇到并解决java.lang.NullPointerException
  2. FCN、Unet、Unet++:医学图像分割网络一览
  3. 点云及三维图像处理综述
  4. 每天2小时,吃透 985博士总结的这套保姆级TensorFlow + PyTorch笔记(20G高清/PPT/代码)...
  5. 22.加密与安全相关,证书申请CA(gpg,openssl)
  6. Flutter——设置appBar的高度
  7. 本地nginx多域名映射
  8. ie与firefox 关于js 的差别(转载)
  9. JAVA基础 (二)反射 深入解析反射机制
  10. nodeJs-autoMerge