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接口测试小框架

    用例设计: 执行用例代码: # -*- coding: UTF-8 -*-import xlrd,logging,urllib,urllib2,json,sysfrom pylsy import py ...

  2. 2的32次方 分类: C#小技巧 2014-08-05 18:18 406人阅读 评论(0) 收藏

    版权声明:本文为博主原创文章,未经博主允许不得转载.

  3. nodejs端口被占用。

    I had the same issue. I ran: $ ps aux | grep node to get the process id, then: $ sudo kill -9 follow ...

  4. 20169210《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...

  5. DOS命令创建以日期为文件名的任务计划TXT文件

    因为每天早上都要做计划,所以做了个批处理文件来创建任务计划TXT文件 文件内容展示如下: 2013/07/09 周二 今日任务: 1. 2. 待办任务: 1. 2. 出现问题: 解决办法: 出现问题: ...

  6. ArrayList and LinkedList

    ArrayList and LinkedList List代表一种线性表的数据结构,ArrayList则是一种顺序存储的线性表.ArrayList底层采用数组来保存每个集合元素,LinkedList则 ...

  7. Linq to Object实现分页获取数据

    最后调用的CSharp代码可以是: int totalcount = dboperator.Customers.Count(); //总记录数 int pagesize = 100;//每页显示数 / ...

  8. Android 颜色渲染(八) SweepGradient扫描/梯度渲染

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] Android 颜色处理(八) SweepGradient 扫描/梯度渲染 为什么什么叫扫描渲染呢?  相信大家都看过雷达扫描的 ...

  9. 一个备份MySQL数据库的简单Shell脚本(转)

    Shell脚本是我们写不同类型命令的一种脚本,这些命令在这一个文件中就可以执行.我们也可以逐一敲入命令手动执行.如果我们要使用shell脚本就必须在一开始把这些命令写到一个文本文件中,以后就可以随意反 ...

  10. async 与 await异步编程活用基础

    [本文转自:http://www.cnblogs.com/x-xk/archive/2013/06/05/3118005.html  作者:肅] 好久没写博客了,时隔5个月,奉上一篇精心准备的文章,希 ...