题目大意
有n个城市(编号从0..n-1),m条公路(双向的),
从中选择n-1条边,使得任意的两个城市能够连通,一条边需要的c的费用和t的时间,
定义一个方案的权值v=n-1条边的费用和*n-1条边的时间和,你的任务是求一个方案使得v最小

Input

第一行两个整数n,m,接下来每行四个整数a,b,c,t,表示有一条公路从城市a到城市b需要t时间和费用c
Output

【output】timeismoney.out
仅一行两个整数sumc,sumt,(sumc表示使得v最小时的费用和,sumc表示最小的时间和) 如果存在多个解使得sumc*sumt相等,输出sumc最小的
Sample Input

5 7

0 1 161 79

0 2 161 15

0 3 13 153

1 4 142 183

2 4 236 80

3 4 40 241

2 1 65 92

Sample Output

279 501

HINT

【数据规模】

1<=N<=200

1<=m<=10000

0<=a,b<=n-1

0<=t,c<=255

有5%的数据m=n-1

有40%的数据有t=c

对于100%的数据如上所述

我们把每个生成树的解(∑t,∑c)=>设为坐标(t,c),k=tc,构成反比例函数

要使k最小,c=k/t尽可能贴近t轴

所以从下凸包中找一个最小的

那么首先最极端的是单纯按t排序或按c排序得到的点A,B

先找到离(A,B)最远的C,在递归(A,C)和(C,B),边界为AC×BC>=0

这样就可以求出所有下凸包上的值

离AB最远的C必定导致SΔABC最大

即AB×AC最大,把常数去掉得到一个关于C的公式,把它带入最小生成树,算出答案

丢个有图的链接,不过边界好像有点问题

http://blog.csdn.net/regina8023/article/details/45246933

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long lol;
struct Node
{
int u,v;
lol t,c,w;
}E[];
struct ZYYS
{
lol x,y;
}A,B,ans;
int n,m,set[];
bool cmp(Node a,Node b)
{
return a.w<b.w;
}
int find(int x)
{
if (set[x]!=x) set[x]=find(set[x]);
return set[x];
}
ZYYS kruskal()
{lol i,cnt;
lol anst,ansc;
ZYYS C;
anst=;ansc=;
for (i=;i<=n;i++)
set[i]=i;
cnt=;
for (i=;i<=m;i++)
{
lol p=find(E[i].u),q=find(E[i].v);
if (p!=q)
{
set[p]=q;
cnt++;
anst+=E[i].t;
ansc+=E[i].c;
if (cnt==n-) break;
}
}
return (ZYYS){ansc,anst};
}
lol cross(ZYYS p,ZYYS a,ZYYS b)
{
return (a.x-p.x)*(b.y-p.y)-(b.x-p.x)*(a.y-p.y);
}
void solve(ZYYS a,ZYYS b)
{ZYYS C;
lol i;
lol y=a.y-b.y,x=b.x-a.x;
for (i=;i<=m;i++)
E[i].w=E[i].t*x+E[i].c*y;
sort(E+,E+m+,cmp);
C=kruskal();
if (C.x*C.y<ans.x*ans.y||(ans.x*ans.y==C.x*C.y&&C.x<ans.x))
ans=C;
if (cross(C,a,b)>=) return;
solve(a,C);
solve(C,b);
}
int main()
{

lol i;
cin>>n>>m;
ans.x=ans.y=1e9;
for (i=;i<=m;i++)
{
scanf("%d%d%lld%lld",&E[i].u,&E[i].v,&E[i].c,&E[i].t);
E[i].u++;
E[i].v++;
}
for (i=;i<=m;i++)
E[i].w=E[i].c;
sort(E+,E+m+,cmp);
A=kruskal();
if (A.x*A.y<ans.x*ans.y)
ans=A;
for (i=;i<=m;i++)
E[i].w=E[i].t;
sort(E+,E+m+,cmp);
B=kruskal();
if (B.x*B.y<ans.x*ans.y)
ans=B;
solve(A,B);
cout<<ans.x<<' '<<ans.y;
}

【BZOJ 2395】Time is money的更多相关文章

  1. 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)

    1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...

  2. Kruskal算法及其类似原理的应用——【BZOJ 3654】tree&&【BZOJ 3624】[Apio2008]免费道路

    首先让我们来介绍Krukal算法,他是一种用来求解最小生成树问题的算法,首先把边按边权排序,然后贪心得从最小开始往大里取,只要那个边的两端点暂时还没有在一个联通块里,我们就把他相连,只要这个图里存在最 ...

  3. 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护

    线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...

  4. LCA 【bzoj 4281】 [ONTAK2015]Związek Harcerstwa Bajtockiego

    [bzoj 4281] [ONTAK2015]Związek Harcerstwa Bajtockiego Description 给定一棵有n个点的无根树,相邻的点之间的距离为1,一开始你位于m点. ...

  5. 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)

    dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...

  6. 【BZOJ 1096】 [ZJOI2007]仓库建设 (斜率优化)

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3940  Solved: 1736 Description ...

  7. 【BZOJ 2132】圈地计划 && 【7.22Test】计划

    两种版本的题面 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土 ...

  8. -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】

    [把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...

  9. 【BZOJ 1032】 [JSOI2007]祖码Zuma

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1032 [题意] [题解] /* 设f[i][j]表示从第i个珠子开始的j个珠子被消除; ...

随机推荐

  1. C语言第十次作业

    一.PTA实验作业 题目1:按等级统计学生成绩 1. 本题PTA提交列表 2.设计思路 int i,count =0 用来计未及格数 for i =0 to n if 指针p+i 指向的成绩score ...

  2. 201621123060《JAVA程序设计》第十一周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...

  3. Android网络传输中必用的两个加密算法:MD5 和 RSA 及Base64加密总结

    (1)commons-codec包简介 包含一些通用的编码解码算法.包括一些语音编码器,Hex,Base64.MD5 一.md5.base64.commons-codec包 commons-codec ...

  4. 【nodejs】安装browser-sync 遇到错误提示

    首先我用的是mac电脑在我执行安装browser-sync时遇到如下问题: 因为不被允许所以我只能不安装全局了: 但是又出现了如下的新问题 纠结了半个小时,终于知道为什么会出现这个问题了, node只 ...

  5. WebApi一个控制器中定义多个Get方法。

    问题:怎样解决一个ApiController中定义多个Get方法或者Post方法? 答:要想实现一个ApiController中定义多个Get方法或者Post方法,则需要在WebApiConfig类中 ...

  6. WPF自学入门(十一)WPF MVVM模式Command命令

    在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式.正如上一篇文章中在开始说的,MVVM的目的是为了最大限度地降低了 ...

  7. Redux应用单一的store原则案例详解

    在开发reac单页面应用的时候,页面的展示逻辑跟数据状态的关系管理变得越来越复杂,redux很好的解决这个问题.废话不多说,直接先上官网api链接. http://cn.redux.js.org/in ...

  8. eclipse怎么停止building workspace

    Eclipse 一直不停 building workspace完美解决总结 一.产生这个问题的原因多种 1.自动升级 2.未正确关闭 3.maven下载lib挂起 等.. 二.解决总结 (1).解决方 ...

  9. restful架构风格设计准则(一)以资源为中心、自描述的请求响应、资源状态迁移为粒度

    读书笔记,原文链接:http://www.cnblogs.com/loveis715/p/4669091.html,感谢作者! 一.需求描述 当用户在某个电子商务网站购物时,他首先查看要购买的商品分类 ...

  10. NOPI实现导入导出泛型List,支持自定义列

    概述 业务上需要自定义列的Excel的导入导出,在网上看了好多资料,很多都是有Bug而且都是支持Excel和DataTable的转换,所以自己总结了一下,应用.NET平台上的NPOI封装了支持自定义列 ...