http://acm.hdu.edu.cn/showproblem.php?pid=4424

【题目大意】

给你N个点和N-1条边的连通图,也就是说任意两点间的路径是唯一的。每条边有个权值,从一点到另一点的最大流量是路径中所有边中权值的最小值。要你找一个点,使得这点到剩下所有点的最大流量之和最大,求这个最大流量和。

【分析1:动态规划 】

假设现在有两个点的集合S1和S2,添加的一条边可以使得这两个集合连通起来,要求最大的流量之和,那么只有两种情况:1、选取的中心点在S1中;2、选取的中心点在S2中。设S中其最小权值的边为E,它连接S1、S2,假设中心点在S1,那么S2中所有的点要连接到中心点必然要通过E这条边过去,且这条边是短板;中心点在S2也类似,所以可以得到如下的DP方程:

DP[S]=max{DP[S1]+e.c*count[S2] , DP[S2]+e.c*count[S1] }  (e.c为边的权值,count为集合中点的数量)

可以用搜索的方法来求对于每层枚举找到最小的边E,再递归下去,直到集合只含一个点,这是种逆向求解的想法,从整体到局部再反推回答案。

【分析2:并查集 & 贪心】

动态规划的方法虽然正确,复杂度也还算可以,但是复杂,涉及到集合的运算和从集合中遍历元素等等...      所以有种贪心的想法:既然每次都是取最小的边,那么随着递推下去,取的边构成的数列是递增有序的,那为什么不直接先把边排序好呢?既然在动态规划中涉及到集合的分裂,那为什么不反过来用集合的合并来求解?这两个是可以同时做到的。

所以可以得到以下做法: 把边从大到小排序,依次选取边的两点所在的集合来合并,并更新集合的元素个数和当前的最大和,用并查集就好了。这种方法其实是动态规划的逆向求解,但本质还是动态规划。

【代码】

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. using namespace std;
  5. int n;
  6. long long sum[];
  7. int mset[];
  8. struct egde
  9. {
  10. int a,b,c;
  11. void read(){scanf("%d%d%d",&a,&b,&c);}
  12. bool operator<(const egde& t)const {return c>t.c;}
  13. }data[];
  14. int find(int x)
  15. {
  16. if (mset[x]<) return x;
  17. return mset[x]=find(mset[x]);
  18. }
  19. void uion(int a,int b,int c)
  20. {
  21. int aa=find(a);
  22. int bb=find(b);
  23. long long sum1=sum[aa]+(long long)c*-mset[bb];
  24. long long sum2=sum[bb]+(long long)c*-mset[aa];
  25. if (sum2>sum1) {swap(aa,bb);swap(a,b);swap(sum1,sum2);}
  26. mset[aa]+=mset[bb];
  27. mset[bb]=aa;
  28. sum[aa]=sum1;
  29. }
  30. int main()
  31. {
  32. while (~scanf("%d",&n))
  33. {
  34. memset(sum,,sizeof sum);
  35. memset(mset,-,sizeof mset);
  36. for (int i=;i<n-;++i) data[i].read();
  37. sort(data,data+n-);
  38. for (int i=;i<n-;++i)
  39. uion(data[i].a,data[i].b,data[i].c);
  40. printf("%I64d\n",sum[find()]);
  41. }
  42. }

HDU 4424 Conquer a New Region的更多相关文章

  1. ZOJ 3659 & HDU 4424 Conquer a New Region (并查集)

    这题要用到一点贪心的思想,因为一个点到另一个点的运载能力决定于其间的边的最小权值,所以先把线段按权值从大到小排个序,每次加的边都比以前小,然后合并集合时,比较 x = findset(a) 做根或 y ...

  2. hdu 4424 Conquer a New Region (并查集)

    ///题意:给出一棵树.树的边上都有边权值,求从一点出发的权值和最大,权值为从一点出去路径上边权的最小值 # include <stdio.h> # include <algorit ...

  3. HDU 4424 Conquer a New Region 最大生成树

    给你一颗树 每条边有一个权值 选择一个点为中心 定义S值为中心到其它n-1个点的路径上的最小边权 求全部点S值的和 从大到小排序 每次合并2棵树 设为A集合 B集合 设A集合的最大S值的和为sumA ...

  4. HDOJ 4424 Conquer a New Region

    并检查集合 侧降序,每增加一个侧面应该推断,其中基本建设方..... Conquer a New Region Time Limit: 8000/4000 MS (Java/Others)    Me ...

  5. hdu 4424 & zoj 3659 Conquer a New Region (并查集 + 贪心)

    Conquer a New Region Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...

  6. zoj 3659 Conquer a New Region The 2012 ACM-ICPC Asia Changchun Regional Contest

    Conquer a New Region Time Limit: 5 Seconds      Memory Limit: 32768 KB The wheel of the history roll ...

  7. ZOJ3659 Conquer a New Region 并查集

    Conquer a New Region Time Limit: 5 Seconds      Memory Limit: 32768 KB The wheel of the history roll ...

  8. hdu4424 Conquer a New Region 并查集/类似最小生成树

    The wheel of the history rolling forward, our king conquered a new region in a distant continent.The ...

  9. hdu 4424 并查集

    思路:将边从大到小排序,判断向哪边连,能使总和最大. #include<map> #include<set> #include<cmath> #include< ...

随机推荐

  1. java 对excel操作 读取、写入、修改数据;导出数据库数据到excel

    ============前提加入jar包jxl.jar========================= // 从数据库导出数据到excel public List<Xskh> outPu ...

  2. java设计模式(装饰模式)

    装饰模式实现了可以动态地为原对象扩展方法 装饰对象与被装饰的都实现了同一个接口(或抽象类) 举个例子: 工作 可以边吃东西边工作,也可以边喝东西边工作,还可以工作的时候边吃边喝 创建共同接口 Work ...

  3. fastcgi 分布式

    以lighttpd fastcgi写一下自己对fastcgi分布式的理解. 假设一台机器A上运行lighttpd,在这台主机上只是对请求进行分发. 而在其他多台机器上运行多个fastcgi进程,用来接 ...

  4. javaScript中"=="和"==="运算符的区别

    相同点: 两个运算符均可用于比较两个值是否相等,可允许操作任意类型的操作数,如果操作数相等则返回true,否则返回false. 不同点: "==="运算符也称为严格相等运算符,它用 ...

  5. Unity3d:megaFierstext(翻书效果插件)

    附件中是一款翻书效果插件,由于附件上传大小限制,在下载完后,需要在megaFierstext_BHYF\Assets\Resources\Textures下添加图片精灵并修改属性为Texture,即可 ...

  6. OC: 类的扩展、类的延展、协议、 NSDate

      NSDateFormatter 指定⽇日期格式: NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; [formatter ...

  7. 自定义Template,向其中添加新的panel

    参考网站:https://www.devexpress.com/Support/Center/Example/Details/E2690 思路: 新建一个DefaultTemplate:       ...

  8. windows win7 win10 多系统启动菜单 多系统引导设置

    win键+R 输入msconfig 根据显示的程序设置(除非你看不懂文字)

  9. SharedObject.getLocal("application-name")

    package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.events.NetStatus ...

  10. oracle 11g 没有scott用户下emp的创建方法

    oracle 11g 安装后 没有scott 用户, 创建scott 用户后 使用select * from emp查询 emp表, 结果为 找不到行. 运行脚本 utlsample.sql 首先as ...