题意:

N个点,M条边。每条边连接两个点u,v,且有一个权值c,c非零即一。

问能否将N个点形成一个生成树,并且这棵树的边权值和是一个fibonacii数。 (fibonacii数=1,2,3,5,8 .... )

思路:

若可以生成一棵树。则有最小生成树和最大生成树。假设已经生成了最小MST  P 和最大MST  Q。

将P更换一条边可以得到另一棵生成树,边权和不是和P相等就是比P的边权和大1。(因为边值非零即一)。同理搞下去....一定可以得到Q。

所以P的边权和到Q的边权和之间的所有值都能得到。故判断之间是否存在fibonacii数即可。

代码:

  1. struct node{
  2. int u,v,c;
  3. }edge[100005];
  4.  
  5. bool cmp(node a,node b){
  6. return a.c<b.c;
  7. }
  8.  
  9. int fa[100005];
  10. int T,n,m;
  11.  
  12. int findFa(int x){
  13. return fa[x]==x?x:fa[x]=findFa(fa[x]);
  14. }
  15.  
  16. int kruskal1(){
  17. rep(i,1,n) fa[i]=i;
  18. int res=0;
  19. rep(i,1,m){
  20. int fx=findFa(edge[i].u);
  21. int fy=findFa(edge[i].v);
  22. if(fx!=fy){
  23. fa[fx]=fy;
  24. res+=edge[i].c;
  25. }
  26. }
  27. int tx=findFa(1);
  28. rep(i,2,n) if(findFa(i)!=tx) return -1;
  29. return res;
  30. }
  31. int kruskal2(){
  32. rep(i,1,n) fa[i]=i;
  33. int res=0;
  34. rep2(i,m,1){
  35. int fx=findFa(edge[i].u);
  36. int fy=findFa(edge[i].v);
  37. if(fx!=fy){
  38. fa[fx]=fy;
  39. res+=edge[i].c;
  40. }
  41. }
  42. int tx=findFa(1);
  43. rep(i,2,n) if(findFa(i)!=tx) return -1;
  44. return res;
  45. }
  46.  
  47. bool isFibo[100005];
  48.  
  49. void FiboD(){
  50. mem(isFibo,false);
  51. int a=1,b=2; isFibo[1]=isFibo[2]=true;
  52. for(;;){
  53. int t=a+b;
  54. a=b, b=t;
  55. if(t>100000) break;
  56. isFibo[t]=true;
  57. }
  58. }
  59.  
  60. int main(){
  61. //freopen("test.in","r",stdin);
  62. cin>>T;
  63. FiboD();
  64. rep(t,1,T){
  65. scanf("%d%d",&n,&m);
  66. rep(i,1,m)
  67. scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].c);
  68. sort(edge+1,edge+1+m,cmp);
  69. int mins=kruskal1();
  70. int maxs=kruskal2();
  71.  
  72. printf("Case #%d: ",t);
  73. if(mins==-1 || maxs==-1) puts("No");
  74. else{
  75. bool flag=false;
  76. rep(i,mins,maxs) if(isFibo[i]){
  77. flag=true;
  78. break;
  79. }
  80. if(flag) puts("Yes"); else puts("No");
  81. }
  82. }
  83. //fclose(stdin);
  84. }

hdu 4786 Fibonacci Tree (最小、最大生成树)的更多相关文章

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

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

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

    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 生成树

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

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

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

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

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

随机推荐

  1. Elaticsearch倒排索引

    ES倒排索引基本原理 索引(index)可以分为正序索引(Forward Indexes)和倒排索引(Inverted Index)两种.在关系型数据库中使用索引可以避免数据检索走全表扫描,将检索的时 ...

  2. 关于Container容器以及IoC注入机制的认识

    container 容器的概念: 1 container 是一个Java 所编写的程序,用于对象之间之间管理对象关系. 主要的java EE 容器如下: Java容器类包含List.ArrayList ...

  3. PHP的那些魔术方法(一)

    在PHP中,有一堆魔术方法,服务于类和对象.PHP虽然也是纯种的面向对象语言,但是之前的PHP还真不是,所以有一些面向对象的标准实现并不完善,比如重载.但是,我们可以通过一些魔术方法来弥补,例如__c ...

  4. TP5框架下实现数据库的备份功能-tp5er/tp5-databackup

    1.安装扩展 方法一: composer require tp5er/tp5-databackup dev-master 方法二 composer.json: "require": ...

  5. html阴影 box-shadow

    右下阴影 div { box-shadow: 10px 10px 5px #888888; }四周阴影 div { box-shadow: 0 0 5px #888888; } div {box-sh ...

  6. 记一次 .NET 某上市工业智造 CPU+内存+挂死 三高分析

    一:背景 1. 讲故事 上个月有位朋友加wx告知他的程序有挂死现象,询问如何进一步分析,截图如下: 看这位朋友还是有一定的分析基础,可能玩的少,缺乏一定的分析经验,当我简单分析之后,我发现这个dump ...

  7. Java基础系列(30)- 命令行传参

    命令行传参 有时候你希望运行一个程序的时候再传递给它消息.这就要靠传递命令行参数main()函数实现 package method; public class CommandLine { public ...

  8. [转载]提升SQLite数据插入效率低、速度慢的方法

    转载地址:http://blog.csdn.net/chenguanzhou123/article/details/9376537#,如果有侵犯原创,请留言告知,本人会及时删除. 前言 SQLite数 ...

  9. Tidb使用

    一.为什么使用Tidb 最近发现tidb在互联网圈大火,新生代的一个NewSql数据库 具体链接可以访问pincap的官网  https://www.pingcap.com/docs-cn/v3.0/ ...

  10. python二级 之 第 五套

    1. 这里要注意输入的   就是列表 .                 [1,2,3] 2. 就是你要明白   random.seed()  产生随机种子# 与random.randint()  取 ...