layout: post
title: 训练指南 UVALive - 5713(最小生成树 + 次小生成树)
author: "luowentaoaa"
catalog: true
mathjax: true
tags:
- 最小生成树
- 图论
- 训练指南


Qin Shi Huang's National Road System

UVALive - 5713

题意

有n个城市,要修一些路使得任意两个城市都能连通。但是有人答应可以不计成本的帮你修一条路,为了使成本最低,你要慎重选择修哪一条路。假设其余的道路长度为B,那条别人帮忙修的道路两端城市中的总人口为B,要找一个使A/B最大的方案。

题意

先求最小生成树,处理出MST中任意两点之间的最长边。因为别人只答应给修一条路,所以枚举这条路,用这条路替换下一条MST中最长的边(在加入这条路后构成的环中),比较求得A/B的最大值。实际上是把求次小生成树的一些后续操作改改。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int maxn=1e3+50;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
int n,m,x[maxn],y[maxn],p[maxn];int pa[maxn];
int findset(int x){return pa[x]!=x?pa[x]=findset(pa[x]):x;}
vector<int>G[maxn];
vector<double>C[maxn];struct Edge{int x,y;double d;bool operator < (const Edge& rhs)const{return d<rhs.d;}
};Edge e[maxn*maxn];
double maxcost[maxn][maxn];
vector<int>nodes;void dfs(int u,int fa,double facost){//cout<<"dfs="<<u<<endl;for(int i=0;i<nodes.size();i++){int x=nodes[i];maxcost[u][x]=maxcost[x][u]=max(maxcost[x][fa],facost);}nodes.push_back(u);for(int i=0;i<G[u].size();i++){if(G[u][i]==fa)continue;dfs(G[u][i],u,C[u][i]);}
}
double dis(int i,int j){return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
double MST(){m=0;for(int i=0;i<n;i++)for(int j=i+1;j<n;j++)e[m++]=(Edge){i,j,dis(i,j)};sort(e,e+m);for(int i=0;i<n;i++){pa[i]=i;G[i].clear();C[i].clear();}int cnt=0;double ans=0;for(int i=0;i<m;i++){int x=e[i].x,y=e[i].y,u=findset(x),v=findset(y);double d=e[i].d;if(u==v)continue;pa[u]=v;G[x].push_back(y);G[y].push_back(x);C[x].push_back(d);C[y].push_back(d);ans+=d;if(++cnt==n-1)break;}return ans;
}
int main()
{std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int t;cin>>t;while(t--){cin>>n;for(int i=0;i<n;i++)cin>>x[i]>>y[i]>>p[i];double tot=MST();memset(maxcost,0,sizeof(maxcost));nodes.clear();dfs(0,-1,0);double ans=-1;for(int i=0;i<n;i++)for(int j=i+1;j<n;j++){ans=max(ans,(p[i]+p[j])/(tot-maxcost[i][j]));}cout<<fixed<<setprecision(2)<<ans<<endl;}return 0;
}

转载于:https://www.cnblogs.com/luowentao/p/10349044.html

训练指南 UVALive - 5713(最小生成树 + 次小生成树)相关推荐

  1. 训练指南 UVALive - 3713 (2-SAT)

    layout: post title: 训练指南 UVALive - 3713 (2-SAT) author: "luowentaoaa" catalog: true mathja ...

  2. 训练指南 UVALive - 4043(二分图匹配 + KM算法)

    layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...

  3. 最小生成树 次小生成树

    树 转载于:https://www.cnblogs.com/aiyi2000/p/9841071.html

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

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

  5. `Computer-Algorithm` 最小生成树MST,Prim,Kruskal,次小生成树

    Contents 最小生成树 Algorithm Prim Code Kruskal Prim&KruskalPrim \& KruskalPrim&Kruskal算法的性质 ...

  6. 最小生成树、次小生成树

    一.最小生成树 说到生成树首先要解释一下树,树是一个联通的无向无环图,多棵树的集合则被称为森林. 因此,树具有许多性质: 1.两点之间的路径是唯一的. 2.边数等于点数减一. 3.连接任意两点都会生成 ...

  7. HDU 4081 最小生成树(或者次小生成树)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4081 Problem Description There were n cities in Chin ...

  8. poj 1679 次小生成树

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

  9. HDU4081(次小生成树)

    1.其中:枚举每条不在最小生成树上的边,并把这条边放到最小生成树上面,然后就一定形成环,那么我们将这条环中取出最长的一条路.最终我们得到的权值便是最小生成树的权值. Max[i][j]表示的最小生成树 ...

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

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

最新文章

  1. bzoj 2756奇怪的游戏
  2. java 并发_Java并发防范机制
  3. 7-2 数组元素循环右移问题 (40 分)
  4. 【引用】IP地址已经分配给另一个适配器问题的解决方法
  5. 高端中餐美食餐饮海报PSD模板,看着就有食欲
  6. C/C++怎样传递二维数组,转载自CSDN
  7. Window Server 2008 R2 文件权限管理
  8. 2021-06-25绝对定位的理解
  9. 第一次c语言课程设计——学生选课管理系统
  10. WEB前端大作业-程序员个人在线简历响应式网站模板(HTML+CSS+JavaScript)
  11. javaEE常用开源框架的认识及概述,带你深入探索Java开发世界
  12. 深度剖析华为的管理哲学(建议收藏)
  13. 牢记公式,ardupilot EKF2就是纸老虎(五)!
  14. J2EE进阶之JSP和EL表达式 十二
  15. 如何给PDF文件加密和解密?
  16. 读《日本包装设计鉴赏》有感之——博客第一篇
  17. 最容易理解的Raft算法讲解
  18. vpp与dpdk的关系
  19. 我的K均值算法的matlab实现
  20. 《大长今》人物系列:长今心理第二课——申主簿

热门文章

  1. 【11月18日截稿】【高校支持】第三届机器人、智能控制与人工智能国际学术会议-RICAI 2021...
  2. 如何搭建ftp服务器实现文件共享
  3. java常见面试题总结2
  4. GitHub 热榜:被网友疯狂恶搞的「蚂蚁呀嘿」项目终于开源了!
  5. 4-5. do...while循环
  6. 怎样将linux系统打包成iso文件,封装linux系统成iso文件
  7. SHELL命令 -- 查看显卡型号
  8. Win7激活工具无效?输入SLMGR -REARM显示不是内部命令?
  9. csps2019格雷码
  10. SEO–关于如何通过利用流量精灵刷百度排名及排名原理~