Description

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

攻打每一个人的堡垒需要一个代价,而且必须攻打若干次才能把镇守之人灭得灰飞烟灭。

当小C在绞尽脑汁想攻打方案时,突然从XXX的堡垒中滚出来一个纸条:一个惊人的秘密被小C发现了:原来各个堡垒之间会相互提供援助,但是当一个堡垒被攻打时,他对所援助的堡垒的援助就会停止,因为他自己已经自身难保了。也就是说,小C只要攻打某个堡垒一次之后,某些堡垒就只需要花更小的代价攻击了。

现在,要你求消灭全机房要用掉代价最小多少。

Input

第一行一个数N,(N<=50),表示机房修建的堡垒数。

接下来N行,每行两个数,第一个实数Ai表示攻打i号堡垒需要的代价Ai(0<Ai<=1000)。第二个数Bi(0<Bi<100)表示i号堡垒需要被攻打Bi次。

接下来一个数k,表示总共有k组依赖关系。

接下来k行每行三个数x,y,z(x,y,为整数,z为实数),表示攻打过一次x号堡垒之后,攻打y号堡垒就只要花z的代价,保证z比y原来的代价小。

不需要攻打的城堡不允许攻打。

Output

一行,一个实数表示消灭全机房要用的最小代价,保留两位小数。

Sample Input

3

10.00 1

1.80 1

2.50 2

2

1 3 2.00

3 2 1.50

Sample Output

15.50

Solution

最小树形图

首先肯定是到达所有需要到达的点一遍,然后每个点都用最小代价攻打

所以按输入将图建出来,每条边的边权就是攻打代价

然后跑最小树形图,最后贪心增加其它代价

  1. #include<bits/stdc++.h>
  2. #define ui unsigned int
  3. #define ll long long
  4. #define db double
  5. #define ld long double
  6. #define ull unsigned long long
  7. const int MAXN=50+5,MAXM=MAXN*MAXN;
  8. const db inf=100000000000.00;
  9. int n,m,times[MAXN],vis[MAXN],bel[MAXN],snt,s,pre[MAXN],nd,M[MAXN];
  10. db in[MAXN],G[MAXN][MAXN],ans;
  11. struct node{
  12. int u,v;
  13. db k;
  14. };
  15. node side[MAXM];
  16. template<typename T> inline void read(T &x)
  17. {
  18. T data=0,w=1;
  19. char ch=0;
  20. while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
  21. if(ch=='-')w=-1,ch=getchar();
  22. while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
  23. x=data*w;
  24. }
  25. template<typename T> inline void write(T x,char ch='\0')
  26. {
  27. if(x<0)putchar('-'),x=-x;
  28. if(x>9)write(x/10);
  29. putchar(x%10+'0');
  30. if(ch!='\0')putchar(ch);
  31. }
  32. template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
  33. template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
  34. template<typename T> inline T min(T x,T y){return x<y?x:y;}
  35. template<typename T> inline T max(T x,T y){return x>y?x:y;}
  36. inline db solve(int rt,int n)
  37. {
  38. db res=0;
  39. while(true)
  40. {
  41. for(register int i=1;i<=n;++i)in[i]=inf;
  42. for(register int i=1;i<=snt;++i)
  43. if(side[i].u!=side[i].v&&in[side[i].v]>side[i].k)in[side[i].v]=side[i].k,pre[side[i].v]=side[i].u;
  44. for(register int i=1;i<=n;++i)
  45. if(i!=rt&&in[i]==inf)return -1;
  46. int cnt=0;
  47. memset(bel,0,sizeof(bel));
  48. memset(vis,0,sizeof(vis));
  49. in[rt]=0;
  50. for(register int i=1,j;i<=n;++i)
  51. {
  52. res+=in[i];j=i;
  53. while(j!=rt&&vis[j]!=i&&!bel[j])vis[j]=i,j=pre[j];
  54. if(j!=rt&&!bel[j])
  55. {
  56. bel[j]=++cnt;
  57. for(register int k=pre[j];k!=j;k=pre[k])bel[k]=cnt;
  58. }
  59. }
  60. if(!cnt)break;
  61. for(register int i=1;i<=n;++i)
  62. if(!bel[i])bel[i]=++cnt;
  63. for(register int i=1,u,v;i<=snt;++i)
  64. {
  65. u=side[i].u,v=side[i].v;
  66. side[i].u=bel[u];side[i].v=bel[v];
  67. if(bel[u]^bel[v])side[i].k-=in[v];
  68. }
  69. n=cnt;
  70. rt=bel[rt];
  71. }
  72. return res;
  73. }
  74. int main()
  75. {
  76. read(n);
  77. s=++nd;
  78. for(register int i=1;i<=n;++i)
  79. {
  80. in[i]=inf;
  81. db cost;scanf("%lf",&cost);read(times[i]);
  82. if(times[i])
  83. {
  84. M[i]=++nd;
  85. side[++snt]=(node){s,M[i],cost};
  86. chkmin(in[i],cost);
  87. }
  88. }
  89. read(m);
  90. for(register int i=1;i<=m;++i)
  91. {
  92. int x,y;read(x);read(y);
  93. db cost;scanf("%lf",&cost);
  94. if(M[x]&&M[y])
  95. {
  96. side[++snt]=(node){M[x],M[y],cost};
  97. chkmin(in[y],cost);
  98. }
  99. }
  100. for(register int i=1;i<=n;++i)
  101. if(times[i]>1)ans+=(times[i]-1)*in[i];
  102. printf("%.2f\n",ans+solve(s,nd));
  103. return 0;
  104. }

【刷题】BZOJ 4349 最小树形图的更多相关文章

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

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

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

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

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

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

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

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

  5. HDU5697 刷题计划 dp+最小乘积生成树

    分析:就是不断递归寻找靠近边界的最优解 学习博客(必须先看这个): 1:http://www.cnblogs.com/autsky-jadek/p/3959446.html 2:http://blog ...

  6. LinCode 刷题 之二叉树最小深度

    http://www.lintcode.com/zh-cn/problem/minimum-depth-of-binary-tree/  题目描述信息 /** * Definition of Tree ...

  7. LeetCode 刷题笔记 155. 最小栈(Min Stack)

    tag: 栈(stack) 题目描述 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素 ...

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

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

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

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

随机推荐

  1. js的视频和音频采集

    js的视频和音频采集 今天要写的,不是大家平时会用到的东西.因为兼容性实在不行,只是为了说明下前端原来还能干这些事. 大家能想象前端是能将摄像头和麦克风的视频流和音频流提取出来,再为所欲为的么.或者说 ...

  2. arcpy示范教学(一):基本操作

    arcpy基本操作 打开目录,遍历目录,打开要素类,遍历要素,打开文件,写入属性值 import arcpy import codecs # 设置工作目录 arcpy.env.workspace = ...

  3. 搜索引擎ElasticSearch系列(三): ElasticSearch2.4.4 bigdesk插件安装

    一:ElasticSearch bigdesk插件简介 bigdesk是elasticsearch的一个集群监控工具,可以通过它来查看es集群的各种状态,如:cpu.内存使用情况,索引数据.搜索情况, ...

  4. CentOS 7.2二进制安装mysql-5.7.19

    官方文档地址:https://dev.mysql.com/doc/refman/5.7/en/binary-installation.html 开始安装 1.下载mysql二进制包 # cd /usr ...

  5. Phaser Matter Collision Plugin 碰撞插件 -- iFiero技术分享

    collision-simple-demo Phaser 自带的Arcade虽然易用,但复杂的物理碰撞明显就不够用了,于是Matter等物理引擎还是不得不学的,以下是Matter物理体碰撞的一个插件, ...

  6. Winrar去广告图文教程

    一.前言 1.1 Winrar 解压缩工具 市场上有很多优秀的压缩工具,常用的有Winrar 和360 压缩工具.Winrar是免费压缩工具,特色是每次使用都会弹出广告.影响用户体验和工作效率,当然最 ...

  7. Spark Shell Examples

    Spark Shell Example 1 - Process Data from List: scala> val pairs = sc.parallelize( List( ("T ...

  8. [线性DP][codeforces-1110D.Jongmah]一道花里胡哨的DP题

    题目来源: Codeforces - 1110D 题意:你有n张牌(1,2,3,...,m)你要尽可能多的打出[x,x+1,x+2] 或者[x,x,x]的牌型,问最多能打出多少种牌 思路: 1.三组[ ...

  9. mysql先删除后插入导致死锁

    所报的错误为:pymysql.err.OperationalError: (1213, 'Deadlock found when trying to get lock; try restarting ...

  10. 亮眼的购物季数据,高涨的 Amazon Prime

    依照往年的惯例,亚马逊公布了 2013 购物季的销售数据.据 The Verge 的报道,今年,仅仅网购星期一(Cyber Monday)一天就在全球范围内销售出 3680 万件商品,而去年这一数字为 ...