【题目链接】 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)
  就能够枚举下凸壳上所有的点了。

【代码】

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. const int N=210,M=10010;
  5. typedef long long LL;
  6. struct P{
  7. int x,y;
  8. P(){x=y=0;}
  9. P(int _x,int _y){x=_x;y=_y;}
  10. P operator-(const P&rhs){return P(x-rhs.x,y-rhs.y);}
  11. }l,r;
  12. LL cross(P a,P b){return (LL)a.x*b.y-(LL)a.y*b.x;}
  13. struct E{int x,y,a,b,c;}e[M];
  14. bool cmp(E a,E b){return a.c<b.c;}
  15. int n,m,f[N];
  16. LL ans=0x3f3f3f3f3f3f3f3f,ansx,ansy;
  17. int sf(int x){return f[x]==x?x:f[x]=sf(f[x]);}
  18. P kruskal(){
  19. P p;int i;
  20. sort(e+1,e+m+1,cmp);
  21. for(int i=1;i<=n;i++)f[i]=i;
  22. for(int i=1;i<=m;i++){
  23. if(sf(e[i].x)!=sf(e[i].y)){
  24. f[f[e[i].x]]=f[e[i].y];
  25. p.x+=e[i].a,p.y+=e[i].b;
  26. }
  27. }if((LL)p.x*p.y<=ans){
  28. if(ans==(LL)p.x*p.y){if(p.x<ansx)ansx=p.x,ansy=p.y;}
  29. else{
  30. ans=(LL)p.x*p.y;
  31. ansx=p.x;
  32. ansy=p.y;
  33. }
  34. }return p;
  35. }
  36. void work(P l,P r){
  37. P t=l-r;
  38. for(int i=1;i<=m;i++)e[i].c=cross(P(e[i].a,e[i].b),t);
  39. P mid=kruskal();
  40. if(cross(mid-l,r-mid)>0)work(l,mid),work(mid,r);
  41. }
  42. int main(){
  43. scanf("%d%d",&n,&m);
  44. for(int i=1;i<=m;i++){
  45. scanf("%d%d%d%d",&e[i].x,&e[i].y,&e[i].a,&e[i].b);
  46. e[i].x++; e[i].y++; e[i].c=e[i].a;
  47. }l=kruskal();
  48. for(int i=1;i<=m;i++)e[i].c=e[i].b;
  49. r=kruskal(); work(l,r);
  50. printf("%lld %lld\n",ansx,ansy);
  51. return 0;
  52. }

BZOJ 2395 [Balkan 2011]Timeismoney(最小乘积生成树)的更多相关文章

  1. bzoj 2395 [Balkan 2011]Timeismoney——最小乘积生成树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2395 如果把 \( \sum t \) 作为 x 坐标,\( \sum c \) 作为 y ...

  2. bzoj2395[Balkan 2011]Timeismoney最小乘积生成树

    所谓最小乘积生成树,即对于一个无向连通图的每一条边均有两个权值xi,yi,在图中找一颗生成树,使得Σxi*Σyi取最小值. 直接处理问题较为棘手,但每条边的权值可以描述为一个二元组(xi,yi),这也 ...

  3. Bzoj2395: [Balkan 2011]Timeismoney(最小乘积生成树)

    问题描述 每条边两个权值 \(x,y\),求一棵 \((\sum x) \times (\sum y)\) 最小的生成树 Sol 把每一棵生成树的权值 \(\sum x\) 和 \(\sum y\) ...

  4. @bzoj - 2395@ [Balkan 2011]Timeismoney

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 有n个城市(编号从0..n-1),m条公路(双向的),从中选择n ...

  5. bzoj 2395: [Balkan 2011]Timeismoney【计算几何+最小生成树】

    妙啊,是一个逼近(?)的做法 把两个值最为平面上的点坐标,然后答案也是一个点. 首先求出可能是答案的点xy分别是按照c和t排序做最小生成树的答案,然后考虑比这两个点的答案小的答案,一定在xy连线靠近原 ...

  6. 【BZOJ2395】【Balkan 2011】Timeismoney 最小乘积生成树

    链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...

  7. 【BZOJ】2395: [Balkan 2011]Timeismoney

    题解 最小乘积生成树! 我们把,x的总和和y的总和作为x坐标和y左边,画在坐标系上 我们选择两个初始点,一个是最靠近y轴的A,也就是x总和最小,一个是最靠近x轴的B,也就是y总和最小 连接两条直线,在 ...

  8. bzoj 2395 Timeismoney —— 最小乘积生成树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2395 参考博客:https://www.cnblogs.com/autsky-jadek/p ...

  9. P5540-[BalkanOI2011]timeismoney|最小乘积生成树【最小生成树,凸壳】

    正题 题目链接:https://www.luogu.com.cn/problem/P5540 题目大意 给出\(n\)个点\(m\)条边边权是一个二元组\((a_i,b_i)\),求出一棵生成树最小化 ...

随机推荐

  1. 【洛谷 P3165】 [CQOI2014]排序机械臂 (Splay)

    题目链接 debug了\(N\)天没debug出来,原来是找后继的时候没有pushdown... 众所周知,,Splay中每个编号对应的节点的值是永远不会变的,因为所有旋转.翻转操作改变的都是父节点和 ...

  2. aspnet_regiis.exe -i 执行报错

    IIS刚部署时出现问题 处理程序“svc-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler” 按照网上的步骤,使用管理员打开CMD 开始->所有程 ...

  3. 更新ubuntu15.10后触摸板点击功能消失

    问题描述: 昨天升级了ubuntu15.10,升级之后很多15.04让人不爽的东西消失了,大快人心,但是突然发现自己的触摸板不怎么好用了,原来可以点击,双指点击代表右键,三指点击代表鼠标中键的功能不见 ...

  4. js中的return

    retrun true: 返回正确的处理结果. return false:分会错误的处理结果,终止处理. return:把控制权返回给页面(如果条件满足,后面的逻辑就不执行了). if(this.in ...

  5. bootstrap-select属性

    # 参考:https://blog.csdn.net/zxl_langya/article/details/79247307 # bootstrap-select属性: <select mult ...

  6. 直接在注册DB服务的时候,做beforeQuery事件监听

  7. Eudyptula Challenge

    http://www.eudyptula-challenge.org/ The Eudyptula Challenge What is it? The Eudyptula Challenge is a ...

  8. Python+Selenium 自动化实现实例-打开浏览器模拟进行搜索数据并验证

    #导入模块 from selenium import webdriverfrom selenium.webdriver.common.keys import Keys #启动火狐浏览器driver = ...

  9. phoenix到hbase的应用

    一.phoenix的简介 hbase的java api或者其语法很难用,可以认为phoenix是一个中间件,提供了访问hbase的另外的语法. 二.配置phoenix和hbase 1.下载 phoen ...

  10. AC日记——【模板】点分治(聪聪可可) 洛谷 P2634

    [模板]点分治(聪聪可可) 思路: 点分治: (感谢灯神) 代码: #include <bits/stdc++.h> using namespace std; #define maxn 2 ...