不会最小树形图的出门左转

其实如果确定每种商品第一件的购买顺序,那么剩下的商品肯定是以最优惠价格购买的。

如何确定各种商品第一件购买时的最小价值呢?

考虑如果购买了\(a_i\)这种商品,那么就能以\(c_i\)的价格购买\(b_i\)这种商品,考虑从\(a_i\)往\(b_i\)连权值为\(c_i\)的有向边。

初始建一个额外的\(S\)点往所有点i连权值为\(v_i\)的有向边。

然后用朱刘算法求一遍最小树形图就行了。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define int long long
const double INF=1e9;
const int N=110;
const int M=10100;
int n,m,r,tru[N];
double ans,mn[N],c[N],num[N];
struct edge{
int u,v;
double w;
}e[M];
int cnt,id[N],top[N],fa[N];
bool work(){
while(2333){
memset(id,0,sizeof(id));
memset(top,0,sizeof(top));
for(int i=1;i<=n;i++)mn[i]=INF;
for(int i=1;i<=m;i++)
if(e[i].u!=e[i].v&&e[i].w<mn[e[i].v])
fa[e[i].v]=e[i].u,mn[e[i].v]=e[i].w;
mn[r]=0;fa[r]=0;
for(int i=1;i<=n;i++)if(mn[i]==INF)return false;
int u;
for(int i=1;i<=n;i++){
ans+=mn[i];
for(u=i;u!=r&&top[u]!=i&&!id[u];u=fa[u])top[u]=i;
if(u!=r&&!id[u]){
id[u]=++cnt;
for(int v=fa[u];v!=u;v=fa[v])id[v]=cnt;
}
}
if(!cnt)return true;
for(int i=1;i<=n;i++)if(!id[i])id[i]=++cnt;
for(int i=1;i<=m;i++){
double last=mn[e[i].v];
e[i].u=id[e[i].u];e[i].v=id[e[i].v];
if(e[i].u!=e[i].v)e[i].w-=last;
}
n=cnt;
r=id[r];
cnt=0;
}
}
int read(){
int sum=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return sum*f;
}
signed main(){
int tot=read();n=0;
for(int i=1;i<=tot;i++){
scanf("%lf",&c[++n]);
num[n]=read()-1;
if(num[n]<0){n--;continue;}
tru[i]=n;
}
m=read();
r=++n;
for(int i=1;i<=n-1;i++)e[m+i].u=r,e[m+i].v=i,e[m+i].w=c[i];
for(int i=1;i<=m;i++){
int u=read(),v=read();
double w;
scanf("%lf",&w);
if(tru[v]==0||tru[u]==0)continue;
e[i].u=tru[u];e[i].v=tru[v];e[i].w=w;
c[tru[v]]=min(c[tru[v]],w);
}
m+=n-1;
for(int i=1;i<=n-1;i++)ans+=num[i]*c[i];
if(work())printf("%.2lf",ans);
else printf("-1");
return 0;
}

BZOJ 2260 商店购物(最小树形图)的更多相关文章

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

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

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

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

  3. Luogu2792 JSOI2008 小店购物 最小树形图

    传送门 被题意杀 本以为一个种类的物品一定要一起买 看了题解才知道可以先把所有要买的物品买一个,剩下要买的物品就可以得到这个种类的物品能够得到的最大优惠-- 所以现在只需要知道:第一次买所有物品一遍时 ...

  4. 【LuoguP2792 】[JSOI2008]小店购物(最小树形图)

    题目链接 题目描述 小店的优惠方案十分简单有趣: 一次消费过程中,如您在本店购买了精制油的话,您购买香皂时就可以享受2.00元/块的优惠价:如果您在本店购买了香皂的话,您购买可乐时就可以享受1.50元 ...

  5. 洛谷P2792 [JSOI2008]小店购物(最小树形图)

    题意 题目链接 Sol 一开始的思路:新建一个虚点向每个点连边,再加上题面中给出的边,边权均为大小*需要购买的数量 然后发现死活都过不去 看了题解才发现题目中有个细节--买了\(A\)就可以买\(B\ ...

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

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

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

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

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

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

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

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

随机推荐

  1. AOJ 2224 Save your cats( 最小生成树 )

    链接:传送门 题意:有个女巫把猫全部抓走放在一个由 n 个木桩(xi,yi),m 个篱笆(起点终点木桩的编号)围成的法术领域内,我们必须用圣水才能将篱笆打开,然而圣水非常贵,所以我们尽量想降低花费来解 ...

  2. 【UOJ#50】【UR #3】链式反应(分治FFT,动态规划)

    [UOJ#50][UR #3]链式反应(分治FFT,动态规划) 题面 UOJ 题解 首先把题目意思捋一捋,大概就是有\(n\)个节点的一棵树,父亲的编号大于儿子. 满足一个点的儿子有\(2+c\)个, ...

  3. flash透明 处于最低

    怎样在html中让flash透明 前提是FLASH里没有用其它形状或图形来作为背景.方法主要是在网页中的Flash加入一个参数,让网页设定Flash文件背景透明,Flash文件本身做不到. 关键: & ...

  4. C#中的IEnumerable<T>知识点

    1.扩展IEnumerable<T>的方法 使继承了IEnumeralbe<T>的接口有了MyS方法 static class MySum {                  ...

  5. hrift does not support polymorphic data types

    hrift does not support polymorphic data types Exception in thread "main" com.facebook.swif ...

  6. [Tailwind] Create Custom Utility Classes in Tailwind

    In this lesson, we learn how to generate custom utility classes in tailwind. We add new properties t ...

  7. spark视频教程免费下载

    下载地址:点我下载   其它章节陆续上传中,Hadoop视频教程正在整理中,敬请关注.

  8. Linux体验之旅(一)——制作U启,安装rhel-server-6.3

    U启制作: 双击UltraISO: 点击文件→打开: 选择rhel-server6.3 点击启动→选择写入硬盘映像 最后选择格式化优盘→写入→完毕 注意:启动盘制作完毕后一定记得将rhel-serve ...

  9. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第一步---開始界面&amp;关卡选择

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦.他说:随便写,第一别全然照搬代码:第二能够说 ...

  10. WebRTC学习与DEMO资源一览

    一. WebRTC学习 1.1   WebRTC现状 本人最早接触WebRTC是在2011年底,那时Google已经在Android源码中加入了webrtc源码,放在/external/webrtc/ ...