最小树形图问题啊

最小树形图是撒哩,就是给你一个有向图,确定一个根,要你到达所有点,那棵最短路径树的总边权

做这个用的是朱(jv)刘(lao)算法。

首先假如有多个联通块就无解啦

对应每个点(除了根),找到一条连向它的最短的边,假如没有环,那这个就是答案嘛

否则就找环,然后缩点,对于一个环,假如要从它的一个成员节点x断开,那么答案是减去环上的边,然后加上连进来的边,那么我们就把所有连向x的边的权,减去环上这条边的权(感觉很像数据备份退流的思想)

不断重复直到没有环。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. #include<cmath>
  7. using namespace std;
  8.  
  9. struct edge{int x,y;double d;}a[];int len;
  10. void ins(int x,int y,double d)
  11. {
  12. len++;
  13. a[len].x=x;a[len].y=y;a[len].d=d;
  14. }
  15. double rch[];int pre[];
  16. int bel[],fr[];
  17. double directed_MST(int n,int rt)
  18. {
  19. double ans=;
  20. while()
  21. {
  22. memset(rch,0x7f,sizeof(rch));
  23. for(int i=;i<=len;i++)
  24. if(a[i].x!=a[i].y&&rch[a[i].y]>a[i].d)
  25. pre[a[i].y]=a[i].x, rch[a[i].y]=a[i].d;
  26. rch[rt]=;
  27. for(int i=;i<=n;i++)
  28. if(rch[i]==0x7f)return -;
  29.  
  30. memset(bel,,sizeof(bel));
  31. memset(fr,,sizeof(fr));
  32. int cnt=;
  33. for(int i=;i<=n;i++)
  34. {
  35. ans+=rch[i];
  36. int k=i;
  37. while(fr[k]!=i&&bel[k]==&&k!=rt) fr[k]=i, k=pre[k];
  38. if(bel[k]==&&k!=rt)
  39. {
  40. cnt++;int t=k;
  41. do
  42. {
  43. bel[k]=cnt;
  44. k=pre[k];
  45. }while(k!=t);
  46. }
  47. }
  48. if(cnt==)return ans;
  49.  
  50. for(int i=;i<=n;i++)
  51. if(bel[i]==)bel[i]=++cnt;
  52. for(int i=;i<=len;i++)
  53. {
  54. if(bel[a[i].x]!=bel[a[i].y])a[i].d-=rch[a[i].y];
  55. a[i].x=bel[a[i].x],a[i].y=bel[a[i].y];
  56. }
  57. n=cnt,rt=bel[rt];
  58. }
  59. }
  60.  
  61. int tp,id[];
  62. int cp[];double cnm[];
  63. int main()
  64. {
  65. int n,m,x,y,pp;double dd;
  66. scanf("%d",&n);tp=;
  67. for(int i=;i<=n;i++)
  68. {
  69. scanf("%lf%d",&dd,&pp);
  70. if(pp>)
  71. {
  72. id[i]=++tp;
  73. cnm[id[i]]=dd;
  74. cp[id[i]]=pp;
  75. }
  76. }
  77.  
  78. n=tp+;len=;
  79. for(int i=;i<n;i++)ins(n,i,cnm[i]);
  80. scanf("%d",&m);
  81. for(int i=;i<=m;i++)
  82. {
  83. scanf("%d%d%lf",&x,&y,&dd);
  84. if(cp[id[x]]>&&cp[id[y]]>)
  85. {
  86. ins(id[x],id[y],dd);
  87. cnm[id[y]]=min(cnm[id[y]],dd);
  88. }
  89. }
  90.  
  91. double ans=directed_MST(n,n);
  92. for(int i=;i<n;i++)
  93. ans+=(double(cp[i]-))*cnm[i];
  94. printf("%.2lf\n",ans);
  95.  
  96. return ;
  97. }

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

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

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

  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. Vue 爬坑之路—— 使用 Vuex + axios 发送请求

    Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource 目前主流的 Vue 项目,都选择 axios  ...

  2. webpack学习(四)— webpack-dev-server

    webpack提供给我们检查压缩代码的功能之外,还提供了1个服务器的插件,这就是webpack-dev-server,利用这个差价我们可以启动个web服务器并时时更新我们的修改. 下面以1个简单的例子 ...

  3. 单链表每k个节点一组进行反转(最后不足k个也反转)

    一道面试题,第一次碰到这道题的时候 要求10分钟之内手写代码实现,当时没写出来,后来花点时间把过程梳理一遍,也挺简单的....... 思路就是在原来单链表反转的基础上,加几个控制参数,记录几个关键节点 ...

  4. Python之数据结构改造

    { "appList":[ { "id" : 120, "name" : "BIGDATA", "alias& ...

  5. 分布式锁获取token

    package com.sankuai.qcs.regulation.nanjing.util; import com.dianping.squirrel.client.StoreKey; impor ...

  6. PAT_A1136#A Delayed Palindrome

    Source: PAT_A1136 A Delayed Palindrome (20 分) Description: Consider a positive integer N written in ...

  7. 51nod1185 威佐夫游戏 V2【博弈论】

    有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取.拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出2堆石子的数量, ...

  8. 使用Selenium爬取网站表格类数据

    本文转载自一下网站:Python爬虫(5):Selenium 爬取东方财富网股票财务报表 https://www.makcyun.top/web_scraping_withpython5.html 需 ...

  9. node源码详解(五)

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource5 本博客同步在https://cnodejs.o ...

  10. StringUtils.isNotBlank 和StringUtils.isNotEmpty 的区别

    StringUtils.isNotBlank判断某字符串是否不为空且长度不为0且不由空白符(whitespace)构成下面是示例:StringUtils.isNotBlank(null) = fals ...