BZOJ 2395 [Balkan 2011]Timeismoney(最小乘积生成树)
【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2395
【题目大意】
给出一张无向图,每条边上有a,b两个值,求生成树,
使得suma*sumb最小,在满足这个前提下保证suma最小。
【题解】
把方案看成一个二维点,x=sum(a),y=sum(b)
答案一定在下凸壳上,找到l,r两个点,l是x最小的,r是y最小的
然后递归调用work(l,r):找到离该直线最远的点,那个点一定在下凸壳上
将边权设为(a,b)叉积(l-r),求出mst就是那个点mid
因为叉积计算的时候包含符号,(suma,sumb)与直线的叉积最小就是三角形的面积最大,
因而就是最远点,总和的叉积最小等价于叉积最小生成树。
然后递归work(l,mid),work(mid,r)
就能够枚举下凸壳上所有的点了。
【代码】
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=210,M=10010;
typedef long long LL;
struct P{
int x,y;
P(){x=y=0;}
P(int _x,int _y){x=_x;y=_y;}
P operator-(const P&rhs){return P(x-rhs.x,y-rhs.y);}
}l,r;
LL cross(P a,P b){return (LL)a.x*b.y-(LL)a.y*b.x;}
struct E{int x,y,a,b,c;}e[M];
bool cmp(E a,E b){return a.c<b.c;}
int n,m,f[N];
LL ans=0x3f3f3f3f3f3f3f3f,ansx,ansy;
int sf(int x){return f[x]==x?x:f[x]=sf(f[x]);}
P kruskal(){
P p;int i;
sort(e+1,e+m+1,cmp);
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=m;i++){
if(sf(e[i].x)!=sf(e[i].y)){
f[f[e[i].x]]=f[e[i].y];
p.x+=e[i].a,p.y+=e[i].b;
}
}if((LL)p.x*p.y<=ans){
if(ans==(LL)p.x*p.y){if(p.x<ansx)ansx=p.x,ansy=p.y;}
else{
ans=(LL)p.x*p.y;
ansx=p.x;
ansy=p.y;
}
}return p;
}
void work(P l,P r){
P t=l-r;
for(int i=1;i<=m;i++)e[i].c=cross(P(e[i].a,e[i].b),t);
P mid=kruskal();
if(cross(mid-l,r-mid)>0)work(l,mid),work(mid,r);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&e[i].x,&e[i].y,&e[i].a,&e[i].b);
e[i].x++; e[i].y++; e[i].c=e[i].a;
}l=kruskal();
for(int i=1;i<=m;i++)e[i].c=e[i].b;
r=kruskal(); work(l,r);
printf("%lld %lld\n",ansx,ansy);
return 0;
}
BZOJ 2395 [Balkan 2011]Timeismoney(最小乘积生成树)的更多相关文章
- bzoj 2395 [Balkan 2011]Timeismoney——最小乘积生成树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2395 如果把 \( \sum t \) 作为 x 坐标,\( \sum c \) 作为 y ...
- bzoj2395[Balkan 2011]Timeismoney最小乘积生成树
所谓最小乘积生成树,即对于一个无向连通图的每一条边均有两个权值xi,yi,在图中找一颗生成树,使得Σxi*Σyi取最小值. 直接处理问题较为棘手,但每条边的权值可以描述为一个二元组(xi,yi),这也 ...
- Bzoj2395: [Balkan 2011]Timeismoney(最小乘积生成树)
问题描述 每条边两个权值 \(x,y\),求一棵 \((\sum x) \times (\sum y)\) 最小的生成树 Sol 把每一棵生成树的权值 \(\sum x\) 和 \(\sum y\) ...
- @bzoj - 2395@ [Balkan 2011]Timeismoney
目录 @description@ @solution@ @accepted code@ @details@ @description@ 有n个城市(编号从0..n-1),m条公路(双向的),从中选择n ...
- bzoj 2395: [Balkan 2011]Timeismoney【计算几何+最小生成树】
妙啊,是一个逼近(?)的做法 把两个值最为平面上的点坐标,然后答案也是一个点. 首先求出可能是答案的点xy分别是按照c和t排序做最小生成树的答案,然后考虑比这两个点的答案小的答案,一定在xy连线靠近原 ...
- 【BZOJ2395】【Balkan 2011】Timeismoney 最小乘积生成树
链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...
- 【BZOJ】2395: [Balkan 2011]Timeismoney
题解 最小乘积生成树! 我们把,x的总和和y的总和作为x坐标和y左边,画在坐标系上 我们选择两个初始点,一个是最靠近y轴的A,也就是x总和最小,一个是最靠近x轴的B,也就是y总和最小 连接两条直线,在 ...
- bzoj 2395 Timeismoney —— 最小乘积生成树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2395 参考博客:https://www.cnblogs.com/autsky-jadek/p ...
- P5540-[BalkanOI2011]timeismoney|最小乘积生成树【最小生成树,凸壳】
正题 题目链接:https://www.luogu.com.cn/problem/P5540 题目大意 给出\(n\)个点\(m\)条边边权是一个二元组\((a_i,b_i)\),求出一棵生成树最小化 ...
随机推荐
- 【转载】Lua中实现类的原理
原文地址 http://wuzhiwei.net/lua_make_class/ 不错,将metatable讲的很透彻,我终于懂了. --------------------------------- ...
- js 基本类型&引用类型
1.基本的数据类型有:undefined,boolean,number,string,null.基本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值 基本类型的比较是值的比较.用==比较 ...
- Solaris 选择使用不同网口的操作
机器上集成两个物理网口,由于先前使用的网口传输速率特别慢且容易丢包,故换成另一个网口,操作如下: 1.查看物理设备信息-- 显示可用的数据链路 root@238-spa:~# dladm show-p ...
- Intel MKL(Math Kernel Library)
1.Intel MKL简介 Intel数学核心函数库(MKL)是一套高度优化.线程安全的数学例程.函数,面向高性能的工程.科学与财务应用.英特尔 MKL 的集群版本包括 ScaLAPACK 与分布式内 ...
- yocto 离线编译
使用yocto编译一个软件包时,一般会先在本地寻找下载好的源码包,如果不存在则根据配置从网络下载. 添加本地源码包 为了支持离线编译,添加一个包的配置文件后,需要在本地也准备好源码包. 可以先打开网络 ...
- C++之初始化问题
首先,我们应该明确的是在C++中初始化不是赋值,因为初始化是必要的,如果读取了未初始化的值将会导致不明确的行为.初始化指创建变量并且给它赋初值,而赋值则是擦除对象的当前值并用新值代替.C++支持两种初 ...
- 转 白话解析:一致性哈希算法 consistent hashing
摘要: 本文首先以一个经典的分布式缓存的应用场景为铺垫,在了解了这个应用场景之后,生动而又不失风趣地介绍了一致性哈希算法,同时也明确给出了一致性哈希算法的优点.存在的问题及其解决办法. 声明与致谢: ...
- Java Redis 连接池 Jedis 工具类
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import redis.clients.jedis.Jedis; import re ...
- POJ 1177 Picture(线段树:扫描线求轮廓周长)
题目链接:http://poj.org/problem?id=1177 题目大意:若干个矩形,求这些矩形重叠形成的图形的轮廓周长. 解题思路:这里引用一下大牛的思路:kuangbin 总体思路: 1. ...
- hdu 1664(数论+同余搜索+记录路径)
Different Digits Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...