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

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

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

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

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

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

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<cmath>
  5. #include<algorithm>
  6. using namespace std;
  7. #define int long long
  8. const double INF=1e9;
  9. const int N=110;
  10. const int M=10100;
  11. int n,m,r,tru[N];
  12. double ans,mn[N],c[N],num[N];
  13. struct edge{
  14. int u,v;
  15. double w;
  16. }e[M];
  17. int cnt,id[N],top[N],fa[N];
  18. bool work(){
  19. while(2333){
  20. memset(id,0,sizeof(id));
  21. memset(top,0,sizeof(top));
  22. for(int i=1;i<=n;i++)mn[i]=INF;
  23. for(int i=1;i<=m;i++)
  24. if(e[i].u!=e[i].v&&e[i].w<mn[e[i].v])
  25. fa[e[i].v]=e[i].u,mn[e[i].v]=e[i].w;
  26. mn[r]=0;fa[r]=0;
  27. for(int i=1;i<=n;i++)if(mn[i]==INF)return false;
  28. int u;
  29. for(int i=1;i<=n;i++){
  30. ans+=mn[i];
  31. for(u=i;u!=r&&top[u]!=i&&!id[u];u=fa[u])top[u]=i;
  32. if(u!=r&&!id[u]){
  33. id[u]=++cnt;
  34. for(int v=fa[u];v!=u;v=fa[v])id[v]=cnt;
  35. }
  36. }
  37. if(!cnt)return true;
  38. for(int i=1;i<=n;i++)if(!id[i])id[i]=++cnt;
  39. for(int i=1;i<=m;i++){
  40. double last=mn[e[i].v];
  41. e[i].u=id[e[i].u];e[i].v=id[e[i].v];
  42. if(e[i].u!=e[i].v)e[i].w-=last;
  43. }
  44. n=cnt;
  45. r=id[r];
  46. cnt=0;
  47. }
  48. }
  49. int read(){
  50. int sum=0,f=1;char ch=getchar();
  51. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  52. while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
  53. return sum*f;
  54. }
  55. signed main(){
  56. int tot=read();n=0;
  57. for(int i=1;i<=tot;i++){
  58. scanf("%lf",&c[++n]);
  59. num[n]=read()-1;
  60. if(num[n]<0){n--;continue;}
  61. tru[i]=n;
  62. }
  63. m=read();
  64. r=++n;
  65. for(int i=1;i<=n-1;i++)e[m+i].u=r,e[m+i].v=i,e[m+i].w=c[i];
  66. for(int i=1;i<=m;i++){
  67. int u=read(),v=read();
  68. double w;
  69. scanf("%lf",&w);
  70. if(tru[v]==0||tru[u]==0)continue;
  71. e[i].u=tru[u];e[i].v=tru[v];e[i].w=w;
  72. c[tru[v]]=min(c[tru[v]],w);
  73. }
  74. m+=n-1;
  75. for(int i=1;i<=n-1;i++)ans+=num[i]*c[i];
  76. if(work())printf("%.2lf",ans);
  77. else printf("-1");
  78. return 0;
  79. }

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. 洛谷 P1567 统计天数

    题目背景 统计天数 题目描述 炎热的夏日,KC非常的不爽.他宁可忍受北极的寒冷,也不愿忍受厦门的夏天.最近,他开始研究天气的变化.他希望用研究的结果预测未来的天气. 经历千辛万苦,他收集了连续N(1& ...

  2. [洛谷 P2365] 任务安排 (线性dp)

    3月14日第二题!! 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间 ...

  3. 谷歌翻译使用php curl请求接口文档

    支持语言 阿拉伯语代码 ar 英语代码 en 中文(简体)代码 zh-CN php中curl类常用方法封装和详解 REST API Method translate POST /language/tr ...

  4. MPlayer 开始支持RTSP/RTP流媒体文件

    hostzhu点评:MPlayer对流媒体的支持,让大家能更进一步地利用linux来看网络直播,对Linux下多媒体应用的推动作用可以说不可度量. RTSP/RTP streaming support ...

  5. selenium+java解决富文本输入

    方法一: Actions actions = new Actions(driver); actions.sendKeys(Keys.TAB).perform(); //鼠标通过tab要先移到富文本框中 ...

  6. HDU 2857 Mirror and Light

    /* hdu 2857 Mirror and Light 计算几何 镜面反射 */ #include<stdio.h> #include<string.h> #include& ...

  7. poj 2914&&hdu 3002 全局最小割Stoer-Wagner算法模板

    #include<stdio.h> #include<string.h> #include<iostream> #define inf 0x3fffffff #de ...

  8. Elasticsearch 7.0 正式发布,盘他!

    Elastic{ON}北京分享了Elasticsearch7.0在Speed,Scale,Relevance等方面的很多新特性. 比快更快,有传说中的那么牛逼吗?盘他! 通过本文,你能了解到: Ela ...

  9. MySQL 与 MongoDB的操作对比

    MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什么地方 ...

  10. C#--文件操作的一些技巧

    Using的特点 Using 打开什么,就自动关闭什么,using中包含的其他类是否关闭,using是不管的 XML文档读取 重点:必须是标准的xml文档,否则会出错 string xmlxx = @ ...