uva1494 最小生成树--例题
这题说的是n个城市 建路 使他们联通然后 , 可以使用一条超级的路这条路不计入总长,此时路长度为B, 这条路链接的两个城市人口与和为A+B, 然后计算出最大的A/B
解题
先生成一颗最小生成树,然后 计算出这颗树上每两个节点之间要经过的最长的那条路,然后枚举每两个节点u 个v 求出答案
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <string.h>
#include <cmath>
using namespace std;
const int maxn =+;
struct Edge{
int u,v;
double dist;
bool operator <(const Edge &rhs)const{
return dist<rhs.dist;
}
};
vector<Edge>E;
struct point{
int x,y;
}LOC[maxn];
int P[maxn],fa[maxn];
double maxcost[maxn][maxn];
struct ed{
int to; double dist;
};
vector<ed>G[ maxn ];
int fid(int u){
return fa[u]==u? u :( fa[u] = fid( fa[u] ) );
}
vector<int>use;
void dfs(int u, int per,double cost){
for(int i =; i < (int )use.size(); i++){
int v = use[i];
maxcost[u][v] = maxcost[v][u] = max( maxcost[per][v], cost);
}
use.push_back(u);
for(int i =; i < (int)G[u].size() ; i++ ){
ed e = G[u][i];
if(e.to!=per) dfs(e.to,u,e.dist);
}
}
double distends(double x1, double y1, double x2, double y2){
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
int cas;
scanf("%d",&cas);
for(int cc =; cc <= cas; ++cc ){
int n;
scanf("%d",&n);
for(int i=; i<n; i++){
scanf("%d%d%d",&LOC[i].x,&LOC[i].y,&P[i]);
G[i].clear(); fa[i] = i;
}
E.clear();
for(int i=; i < n; i++)
for(int j = i+; j < n; j++ ){
double d = distends(LOC[i].x,LOC[i].y, LOC[j].x, LOC[j].y);
E.push_back( (Edge){ i,j,d } );
}
sort(E.begin() , E.end());
double sum_dist=;
int ge=n;
for(int i =; i<(int)E.size(); i++ ){
int u = E[i].u, v = E[i].v;
double dist = E[i].dist;
int fu = fid(u),fv =fid(v);
if(fu != fv){
G[u].push_back( (ed){v,dist} ); G[v].push_back( (ed){u,dist} );
fa[ fu ] = fv;
sum_dist+=dist;
ge--; if(ge==) break;
}
}
memset(maxcost,,sizeof(maxcost));
use.clear();
dfs(,-,0.0);
double ans =;
for(int i =; i<n; i++)
for(int j =i+ ; j<n; j++ ){
double c = 1.0*(P[i]+P[j])/(sum_dist-maxcost[i][j]);
if(ans<c){
ans=c;
}
}
printf("%.2f\n",ans);
}
return ;
}
uva1494 最小生成树--例题的更多相关文章
- 【数据结构】 最小生成树(三)——prim算法
上一期介绍到了kruskal算法,这个算法诞生于1956年,重难点就是如何判断是否形成回路,此处要用到并查集,不会用当然会觉得难,今天介绍的prim算法在kruskal算法之后一年(即1957年)诞生 ...
- 【数据结构】 最小生成树(四)——利用kruskal算法搞定例题×3+变形+一道大水题
在这一专辑(最小生成树)中的上一期讲到了prim算法,但是prim算法比较难懂,为了避免看不懂,就先用kruskal算法写题吧,下面将会将三道例题,加一道变形,以及一道大水题,水到不用高级数据结构,建 ...
- 紫书 例题 11-14 UVa 1279 (动点最小生成树)(详细解释)
这道题写了好久-- 在三维空间里面有动的点, 然后求有几次最小生成树. 其实很容易发现, 在最小生成树切换的时候,在这个时候一定有两条边相等, 而且等一下更大的那条边在最小生成树中,等一下更小的边不在 ...
- 紫书 例题 11-3 UVa 1151 (有边集的最小生成树+二进制枚举子集)
标题指的边集是说这道题的套餐, 是由几条边构成的. 思路是先做一遍最小生成树排除边, 因为如果第一次做没有加入的边, 到后来新加入了很多权值为0的边,这些边肯定排在最前面,然后这条边的前面的那些边肯定 ...
- 【最小生成树之Kruskal例题-建设电力系统】-C++
前置知识点Kruskal最短路算法,如果没掌握的请先去掌握! 描述 小明所在的城市由于下暴雪的原因,电力系统严重受损.许多电力线路被破坏,因此许多村庄与主电网失去了联系.政府想尽快重建电力系统,所以, ...
- acm常见算法及例题
转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法: (1)枚举. (poj17 ...
- 次小生成树学习+例题 poj 1679 The Unique MST
次小生成树学习: 顾名思义,次小生成树,就是将图的所有生成树排序后,权值第二小的生成树. 次小生成树的朴素求法是很好想的,即首先求出最小生成树,之后枚举最小生成树中的所有边,将当前枚举的边" ...
- 最小生成树之Kruskal(克鲁斯卡尔)算法
学习最小生成树算法之前我们先来了解下下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的所 ...
- 最小生成树--克鲁斯卡尔算法(Kruskal)
按照惯例,接下来是本篇目录: $1 什么是最小生成树? $2 什么是克鲁斯卡尔算法? $3 克鲁斯卡尔算法的例题 摘要:本片讲的是最小生成树中的玄学算法--克鲁斯卡尔算法,然后就没有然后了. $1 什 ...
随机推荐
- 【转】C内存管理
在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重 ...
- mysql概要(六)连接(内连接,左,右外连接
内连接 [join on / from 表1,表二 ]效果一样 区别是:可以理解为首先取得笛卡儿积后,再匹配/还是根据条件获得笛卡尔积 内连接:取俩表的交叉匹配数据:(mysql 内连接 左连接 右连 ...
- 几种在Linux下查询外网IP的办法(转)
Curl 纯文本格式输出: curl icanhazip.com curl ifconfig.me curl curlmyip.com curl ip.appspot.com curl ipinfo. ...
- eclipse+gnuarm+使用报错
Description Resource Path Location TypeProgram "echo" not found in PATH stm32 Project Prop ...
- [Oracle]Oracle之Chr函数返回
Chr函数 返回:返回 String,其中包含有与指定的字符代码相关的字符. chr('39')是单引号 Chr("0") 为0的字符 Chr("1") Chr ...
- firmware 固件
COMPPUTER SCIENCE AN OVERVIEW 11th Edition firmware 固件 boot loader 引导程序 device driver 设备驱动程序 Basic I ...
- HashMap实现原理分析(面试问题:两个hashcode相同 的对象怎么存入hashmap的)
1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...
- [python+opencv] ROI(Range Of Interest)与泛洪填充
python+opencv3.3视频教学 基础入门笔记(贾志刚老师) https://www.bilibili.com/video/av24998616/?p=8 ROI(Range Of Inter ...
- Java GUI程序设计
在实际应用中,我们见到的许多应用界面都属于GUI图形型用户界面.如:我们点击QQ图标,就会弹出一个QQ登陆界面的对话框.这个QQ图标就可以被称作图形化的用户界面. 其实,用户界面的类型分为两类:Com ...
- "portrait"(竖屏) "landscape"(横屏) css设置
取决于浏览器或者设备的方向,HTML元素总是会有"portrait"(竖屏) "landscape"(横屏) class. 你可以在css中如下使用它们: .p ...