Description

Grant是一个个体户老板,他经营的小店因为其丰富的优惠方案深受附近居民的青睐,生意红火。小店的优惠方案十分简单有趣。Grant规定:在一次消费过程中,如果您在本店购买了精制油的话,您购买香皂时就可以享受2.00元/块的优惠价;如果您在本店购买了香皂的话,您购买可乐时就可以享受1.50元/听的优惠价……诸如此类的优惠方案就是说:如果您在本店购买了商品A的话,您就可以以P元/件的优惠价格购买商品B(购买的数量不限)。有趣的是,你需要购买同样一些商品,由于不同的购买顺序,Grant老板可能会叫你付不同数量的钱。比如你需要一块香皂(原价2.50元)、一瓶精制油(原价10.00元)、一听可乐(原价1.80元),如果你按照可乐,精制油,香皂这样的顺序购买的话,Grant老板会问你要13.80元;而如果你按照精制油,香皂,可乐这样的顺序购买的话,您只需付13.50元。 
现在该村的居民请你编写一个程序,告诉你Grant小店商品的原价,所有优惠方案及所需的商品,计算至少需要花多少钱。不允许购买任何不需要的商品,即使这样做可能使花得钱更少。

Input

,第一行为一个整数n(1<=n<=50),表示Grant小店的商品种数。接下来是n行,其中第(i+1)行由一个实数C(0<Ci<=1000)和一个整数M(0<=Mi<=100)组成,其间由一个空格分隔,分别表示第i种商品的原价和所需数量。第(n+2)行又是一个整数k,表示Grant小店的优惠方案总数。接着k行,每行有二个整数A,B(1<=A,B<=n)和一个实数P(0<=P<1000),表示一种优惠方案,即如果您购买了商品A,您就可以以P元/件的优惠价格购买商品B,P小于商品B的原价。所有优惠方案的(A,B)都是不同的。为了方便,Grant不收分币,所以所有价格都不会出现分。

Output

只有一个实数,表示最少需要花多少钱。输出实数须保留两位小数。

Sample Input

4
10.00 1
1.80 1
3.00 0
2.50 2
2
1 4 2.00
4 2 1.50

Sample Output

15.50
 
题解:
先要了解一下什么是最小树形图
http://blog.csdn.net/wsniyufang/article/details/6747392
然后由于所有要买的东西都最少有一个,所以对于每一种东西他除了第一件以外肯定可以用最低的价格买剩下的
然后对于第一个如何来买,我们这样构图
先加一个额外的点,它向每种东西连一条权值为原价的有向边
然后对于一个优惠关系(a,b),我们从a向b连一条权值为优惠价的有向边
然后作一遍最小树形图即可
code:
 #include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define maxn 105
#define maxm 5105
using namespace std;
int n,m,a,b,tim[maxn],sum[maxn],flag[maxn];
double c,ans;
int tmp,best[maxn],bel[maxn],idx,vis[maxn];
struct Graph{
int tot,now[maxn],fa[maxm],son[maxm],pre[maxm];
double val[maxm];
void init(){tot=;memset(now,,sizeof(now));}
void put(int a,int b,double c){pre[++tot]=now[a],now[a]=tot,son[tot]=b,val[tot]=c,fa[tot]=a;}
void prepare(){
for (int u=;u<=n;u++) if (!flag[u])
for (int p=now[u],v=son[p];p;p=pre[p],v=son[p])
if (best[v]==-||val[best[v]]>val[p]) best[v]=p;
memset(vis,-,sizeof(vis));
tmp=n,vis[]=;
for (int i=;i<=n;i++) if (!flag[i]&&vis[i]==-){
int u,v; ++idx;
for (u=i;vis[u]==-;u=fa[best[u]]) vis[u]=idx;
if (vis[u]<idx) continue;
v=u,bel[u]=++tmp,vis[v]=;
for (v=fa[best[v]];vis[v]==idx;v=fa[best[v]]) vis[v]=,bel[v]=tmp;
}
}
}G[];
void work(){
for (int t=;;t^=){
for (int i=;i<=n;i++) best[i]=-;
G[t].prepare(),G[t^].init();
if (tmp==n){
for (int i=;i<=n;i++) if (!flag[i]) ans+=G[t].val[best[i]];
break;
}
for (int u=;u<=n;u++) if (!flag[u]){
for (int p=G[t].now[u],v=G[t].son[p];p;p=G[t].pre[p],v=G[t].son[p]){
if (bel[u]&&bel[v]&&bel[u]==bel[v]) continue;
int a;
if (bel[u]) a=bel[u]; else a=u;
if (bel[v]) G[t^].put(a,bel[v],G[t].val[p]-G[t].val[best[v]]);
else G[t^].put(a,v,G[t].val[p]);
}
if (bel[u]) ans+=G[t].val[best[u]],flag[u]=;
}
n=tmp;
}
printf("%.2lf\n",ans);
}
double low[maxn];
int main(){
scanf("%d",&n);
for (int i=;i<=n;i++){
scanf("%lf%d",&c,&tim[i]);
if (tim[i]) G[].put(,i,c),low[i]=c; else flag[i]=;
}
scanf("%d",&m);
for (int i=;i<=m;i++){
scanf("%d%d%lf",&a,&b,&c);
if (flag[a]||flag[b]) continue;
low[b]=min(low[b],c);
G[].put(a,b,c);
}
for (int i=;i<=n;i++) if (!flag[i]) ans+=low[i]*(tim[i]-);
work();
return ;
}

bzoj2260: 商店购物 && 4349: 最小树形图的更多相关文章

  1. bzoj2260: 商店购物&&4349: 最小树形图

    最小树形图问题啊 最小树形图是撒哩,就是给你一个有向图,确定一个根,要你到达所有点,那棵最短路径树的总边权 做这个用的是朱(jv)刘(lao)算法. 首先假如有多个联通块就无解啦 对应每个点(除了根) ...

  2. BZOJ 2260 商店购物(最小树形图)

    不会最小树形图的出门左转 其实如果确定每种商品第一件的购买顺序,那么剩下的商品肯定是以最优惠价格购买的. 如何确定各种商品第一件购买时的最小价值呢? 考虑如果购买了\(a_i\)这种商品,那么就能以\ ...

  3. 【BZOJ】4349: 最小树形图

    题解 我们只考虑给每个点买一个,之后每个点就可以用最低价格买了 根据最小树形图的算法,就是不断给每个点入度的边找一条最小的 如果构成了树形图就退出,否则把形成了环的点缩成一个点,加上环的权值,然后把指 ...

  4. 【刷题】BZOJ 4349 最小树形图

    Description 小C现在正要攻打科学馆腹地------计算机第三机房.而信息组的同学们已经建好了一座座堡垒,准备迎战.小C作为一种高度智慧的可怕生物,早已对同学们的信息了如指掌. 攻打每一个人 ...

  5. [JSOI2008]小店购物 & bzoj4349:最小树形图 最小树形图

    ---题面(洛谷)--- ---题面(bzoj)--- 其实是同一道题,,,样例都一模一样 题解: 一开始看想了好久,,,还想到了最短路和最小生成树,,然而写的时候才意识到最小生成树应该要用无向边 其 ...

  6. bzoj4349: 最小树形图&&bzoj2260: 商店购物

    双倍经验大法吼 昨天发现不会最小属性图&朱刘算法啊 吓得我赶紧补了一发 朱刘算法模板题 #include <iostream> #include <cstdio> #i ...

  7. bzoj 4349 最小树形图——朱刘算法

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4349. 学习博客:http://www.cnblogs.com/xzxl/p/7243466 ...

  8. 【Bzoj2260】【Bzoj4349】商店购物 & 最小树形图

    目录 List Bzoj 2260 商店购物 Description Input Output Sample Input Sample Output Bzoj 4349 最小树形图 Descripti ...

  9. 【刷题】BZOJ 2260 商店购物

    Description Grant是一个个体户老板,他经营的小店因为其丰富的优惠方案深受附近居民的青睐,生意红火.小店的优惠方案十分简单有趣.Grant规定:在一次消费过程中,如果您在本店购买了精制油 ...

随机推荐

  1. 关于python写GUI桌面应用的一些研究结果

    研究了一下python开发GUI桌面应用的解决方案,研究结果记录如下: EasyGui:控件极为简单,连个基本的grid.list组件都没有,不适合商用,甚至是普通的应用都不行,放弃! Tkinter ...

  2. mvcc摘抄

    MVCC浅析原文:---->>>>>> http://blog.csdn.net/chosen0ne/article/details/18093187 在并发读写数 ...

  3. 几个命令行命令的总结(node, babel-cli, babel-node)

    node: 输入node, 进入repl环境之后,可以直接运行javascsript表达式,模拟node输出 sh-it-nb0023:static xialei$ node > console ...

  4. The Boost C++ Libraries

    " ...one of the most highly regarded and expertly designed C++ library projects in the world.&q ...

  5. js 解析 bytearray 成 字符串

    function bin2String(array) { return String.fromCharCode.apply(String, array); } var bit=[104,101,108 ...

  6. android 42 获取图片

    资源中获取图片:可以从工程assets文件夹.res/drawble文件夹.sd卡.服务端下载图片. 页面: <LinearLayout xmlns:android="http://s ...

  7. linux 最大文件描述符fd

    使用四种框架分别实现百万websocket常连接的服务器 著名的 C10K 问题提出的时候, 正是 2001 年.这篇文章可以说是高性能服务器开发的一个标志性文档,它讨论的就是单机为1万个连接提供服务 ...

  8. FastDFS安装配置手册

    文件服务器分布式系统安装手册 本文档详细的介绍了FastDFS的最小集群安装过程.集群环境如下: tracker:20.2.64.133 .用于调度工作,在访问上起负载均衡的作用. group1: s ...

  9. Eclipse清除SVN密码

    1. Eclipse/Subclipse并不会记录用户名及密码, SVN密码是由SVN客户端(JavaHL or SVNKit)负责维持的 2. 可查看Eclipse的Preferences中SVN属 ...

  10. C# 里窗体里(windows form)怎么播放音乐

    在.NET的winform里面,没有托管的音乐播放器,API只能播放WAV格式,对于MP3等形式的音频文件,就要依赖于 MediaPlayer里,嘿嘿 使用的方法: 在toolbox上点右键,选择“选 ...