题意:给一张由白边和黑边构成的无向图,求是否存在一个生成树,使白边的数量为一个斐波那契数。

分析:白边权值为1,黑边权值为0。求出该图的最小生成树和最大生成树,若这两个值之间存在斐波那契数,则可以,若不存在或者所给的图不是连通图,则不行。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 1e5+5;
  4. typedef long long LL;
  5. set<int> dp;
  6. struct Edge{
  7. int u,v,w;
  8. }edge[maxn<<1];
  9. int n,m;
  10. bool cmp (const Edge & x,const Edge & y) {
  11. return x.w<y.w;
  12. }
  13. bool cmp2(const Edge &x, const Edge &y) {
  14. return x.w>y.w;
  15. }
  16. int fa[maxn];
  17. void init()
  18. {
  19. for(int i=0;i<=n;++i) fa[i] = i;
  20. }
  21. int Find(int x)
  22. {
  23. return fa[x] ==x ? x: fa[x] = Find(fa[x]);
  24. }
  25. void Union(int x,int y)
  26. {
  27. int fx = Find(x), fy = Find(y);
  28. fa[fx] = fy;
  29. }
  30. int kruskal()
  31. {
  32. init();
  33. int res = 0, cnt = 0;
  34. for(int i=1,u,v,w;i<=m;++i){
  35. u =edge[i].u, v= edge[i].v, w =edge[i].w;
  36. if(Find(u)!=Find(v)){
  37. Union(u,v);
  38. res += w;
  39. ++cnt;
  40. if(cnt>=n-1) break;
  41. }
  42. }
  43. if(cnt<n-1) return -1;
  44. return res;
  45. }
  46. int kruskal2()
  47. {
  48. init();
  49. int res = 0, cnt= 0;
  50. for(int i=m,u,v,w;i>=1;--i){
  51. u =edge[i].u, v= edge[i].v, w =edge[i].w;
  52. if(Find(u)!=Find(v)){
  53. Union(u,v);
  54. res += w;
  55. ++cnt;
  56. if(cnt>=n-1) break;
  57. }
  58. }
  59. if(cnt<n-1) return -1;
  60. return res;
  61. }
  62. int fib[maxn];
  63. int pt;
  64. void pre()
  65. {
  66. fib[1] = 1, fib[2] = 2;
  67. dp.insert(1);
  68. dp.insert(2);
  69. int i;
  70. for(i=3;i<maxn;++i){
  71. fib[i] = fib[i-1] + fib[i-2];
  72. dp.insert(fib[i]);
  73. if(fib[i]>100000) break;
  74. }
  75. }
  76. int main()
  77. {
  78. int T,cas=1;
  79. scanf("%d",&T);
  80. pre();
  81. while(T--){
  82. scanf("%d %d",&n, &m);
  83. for(int i=1;i<=m;++i){
  84. scanf("%d %d %d",&edge[i].u, &edge[i].v, &edge[i].w);
  85. }
  86. sort(edge+1,edge+m+1,cmp);
  87. int t1 = kruskal();
  88. int t2 = kruskal2();
  89. if(t1>t2) swap(t1,t2);
  90. printf("Case #%d: ",cas++);
  91. bool f = false;
  92. for(int i=t1;i<=t2;++i){
  93. if(dp.find(i)!=dp.end()){
  94. f = true;
  95. break;
  96. }
  97. }
  98. if(f) printf("Yes\n");
  99. else printf("No\n");
  100. }
  101. return 0;
  102. }

HDU - 4786 Fibonacci Tree (MST)的更多相关文章

  1. hdu 4786 Fibonacci Tree (2013ACMICPC 成都站 F)

    http://acm.hdu.edu.cn/showproblem.php?pid=4786 Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others) ...

  2. HDU 4786 Fibonacci Tree(生成树,YY乱搞)

    http://acm.hdu.edu.cn/showproblem.php? pid=4786 Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others ...

  3. HDU 4786 Fibonacci Tree 最小生成树

    Fibonacci Tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4786 Description Coach Pang is intere ...

  4. HDU 4786 Fibonacci Tree

    Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) P ...

  5. HDU 4786 Fibonacci Tree (2013成都1006题)

    Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  6. hdu 4786 Fibonacci Tree(最小生成树)

    Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  7. 【HDU 4786 Fibonacci Tree】最小生成树

    一个由n个顶点m条边(可能有重边)构成的无向图(可能不连通),每条边的权值不是0就是1. 给出n.m和每条边的权值,问是否存在生成树,其边权值和为fibonacci数集合{1,2,3,5,8...}中 ...

  8. HDU 4786 Fibonacci Tree 生成树

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4786 题意:有N个节点(1 <= N <= 10^5),M条边(0 <= M <= ...

  9. hdu 4786 Fibonacci Tree 乱搞 智商题目 最小生成树

    首先计算图的联通情况,如果图本身不联通一定不会出现生成树,输出"NO",之后清空,加白边,看最多能加多少条,清空,加黑边,看能加多少条,即可得白边的最大值与最小值,之后判断Fibo ...

随机推荐

  1. MyBitis(iBitis)系列随笔之一:MyBitis入门实例

        MyBits前身是iBitis,相对于Hibernate而言,它是半自动化ORM框架.本着分享和学习的目的,笔者将陆续把学习笔记与代码贴出,希望对想学习mybitis的同窗们有所帮助.     ...

  2. (转)有关thread线程

    Python 标准库提供了 thread 和 threading 两个模块来对多线程进行支持.其中, thread 模块以低级.原始的方式来处理和控制线程,而 threading 模块通过对 thre ...

  3. cocos中lua使用shader实例

    local prog = cc.GLProgram:create("res/shader/light2d.vsh","res/shader/light2d.fsh&quo ...

  4. 如何在Myeclipse中启动多个Tomcat

    比如:有两个版本的tomcat,一个5.*,一个6.*,此时由于两个工程分别部署在两个版本的tomcat下,需要同时启动两个tomcat,以下是方法: 1.特别要注意: 不要设置CATALINA_HO ...

  5. JavaScript匿名函数的使用

    JavaScript匿名函数的使用:  http://www.cnblogs.com/skykang/archive/2010/12/03/1895274.html 一.什么是匿名函数? 在Javas ...

  6. SDL 威胁建模工具入门 threat modeling tool

    http://msdn.microsoft.com/zh-cn/magazine/dd347831.aspx threat modeling tool 威胁建模工具 minifuzz 文件模糊工具 c ...

  7. 基于Consul+Upsync+Nginx实现动态负载均衡

    基于Consul+Upsync+Nginx实现动态负载均衡 1.Consul环境搭建 下载consul_0.7.5_linux_amd64.zip到/usr/local/src目录 cd /usr/l ...

  8. oracle导入csv文件

    oracle导入csv文件: 1.建好对应的表和字段: 2.新建test.ctl文件,用记事本编辑写入: load data infile 'e:\TB_KC_SERV.csv' --修改对应的文件路 ...

  9. Linux下 解包/打包 Android 映像文件 system.img, boot.img, ramdisk.img, userdata.img.

    Linux下 解包/打包 Android 映像文件 system.img, boot.img, ramdisk.img, userdata.img. 2014年10月20日 ⁄ 计算机视觉 ⁄ 共 1 ...

  10. 页面加载异常 清除浏览器静态文件 js css 缓存 js动态加载js css文件,可以配置文件后辍,防止浏览器缓存

    js清除浏览器缓存的几种方法 - 兔老霸夏 - 博客园 https://www.cnblogs.com/Mr-Rocker/p/6031096.html js清除浏览器缓存的几种方法   一.CSS和 ...