Fibonacci Tree

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

题意:给你一个无向图,然后其中有的边是白色的有的边是黑色的。然后问你是否存在一棵生成树,在这课生成树上白色边的数量是一个斐波那契数。

题解:完全没有那样的思想,一道现场水题,就是不会啊,实力太弱 啊。注定打铁啊。这一题是这样的,采用极端思维:就是分别用白色和黑色优先的边去求生成树,得到一个白色数量的区间。这里需要理解的是,白色边的数目,可以在这个区间内变化。也就是构成生成树的白色边的数量在这个区间内,如果这个区间内的数没有一个是斐波那契数,那么就不可能了。同时处理出1e5以内的斐波那契数。

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<iostream>
  5 using namespace std;
  6 const int N=2e5+10;
  7 int fa[N],f[40],vis[N];
  8 int n,m,u,v,w;
  9 struct Node{
 10    int u,v;
 11    int w;
 12    bool operator<(const Node a)const {
 13     return w>a.w;
 14     }
 15 }edge1[N];
 16 struct Node1{
 17    int u,v;
 18    int w;
 19    bool operator<(const Node1 a)const {
 20     return w<a.w;
 21     }
 22 }edge2[N];
 23 void init(){
 24    for(int i=1;i<=n;i++)
 25     fa[i]=i;
 26 }
 27 int Find(int x){
 28     int s;
 29     for(s=x;s!=fa[s];s=fa[s]);
 30     while(x!=s){
 31         int temp=fa[x];
 32           fa[x]=s;
 33           x=temp;
 34     }
 35    return s;
 36 }
 37 int solve1(){//黑色优先
 38    int ct=0,num=0;
 39    for(int i=1;i<=m;i++){
 40       int u=Find(edge1[i].u);
 41       int v=Find(edge1[i].v);
 42       if(u!=v){
 43         fa[u]=v;
 44         if(edge1[i].w==1)
 45             ct++;
 46         num++;
 47       }
 48      if(num==n-1)
 49         return ct;
 50    }
 51    return 0;
 52 }
 53 int solve2(){
 54     init();
 55    int ct=0,num=0;
 56    for(int i=1;i<=m;i++){
 57       int u=Find(edge2[i].u);
 58       int v=Find(edge2[i].v);
 59       if(u!=v){
 60         fa[u]=v;
 61         if(edge2[i].w==1)
 62             ct++;
 63         num++;
 64       }
 65      if(num==n-1)
 66         return ct;
 67    }
 68    return 0;
 69 }
 70 int main(){
 71     int T,tt=1;
 72     scanf("%d",&T);
 73    while(T--){
 74      scanf("%d%d",&n,&m);
 75       init();
 76       for(int i=1;i<=m;i++){
 77           scanf("%d %d %d",&u,&v,&w);
 78         edge1[i].u=u;edge1[i].v=v;edge1[i].w=w;
 79         edge2[i].u=u;edge2[i].v=v;edge2[i].w=w;
 80       }
 81       sort(edge1+1,edge1+m+1);
 82       sort(edge2+1,edge2+m+1);
 83       int ll=solve2();
 84       int rr=solve1();
 85       memset(f,0,sizeof(f));
 86       memset(vis,0,sizeof(vis));
 87       f[0]=0;f[1]=1;
 88       for(int i=2;i<=21;i++){
 89          f[i]=f[i-1]+f[i-2];
 90          vis[f[i]]=1;
 91       }
 92       bool flag=false;
 93       for(int i=ll;i<=rr;i++)
 94       if(vis[i]){
 95         flag=true;
 96         break;
 97       }
 98       if(flag)printf("Case #%d: Yes\n",tt++);
 99       else
100         printf("Case #%d: No\n",tt++);
101    }
102 }

Fibonacci Tree

时间: 2024-10-12 11:24:39

Fibonacci Tree的相关文章

Hdoj 4786 Fibonacci Tree 【kruskal】

Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2588 Accepted Submission(s): 822 Problem Description Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to do s

hdoj 4786 Fibonacci Tree 【生成树+想法】

题目:hdoj 4786 Fibonacci Tree 题意:给出 n 个点 m 条边的图,边只有两种颜色,白色和黑色,让你判断能不能让一个生成树中白边的个数为斐波那契数. 分析:这是个想法题目,前提是知道生成树的定义:生成树必须是所有点都在树中 那么既然要是斐波那契数,我只要把白色边的最大个数和最小个数求出来,如果这个范围内有斐波那契数的话,那么就满足条件. 当然这样求的前提条件是期间的所有的生成树都是满足条件的.即都是满足能够生成树的. ok,AC代码: #include<iostream>

HDU 4786 Fibonacci Tree 最小生成树变形

思路: 这题比赛的时候想了好久,最后队友机智的想到了. 不过那时不是我敲的,现在敲的1A. 想好就容易了. 直接把1或者0当做边的权值,然后按边从小到大排序,然后算最小生成用到了几条白边,然后再按边从大到小排序,然后再算白边用了几条.然后最小和最大需要用到的白边都算出来了.如果在这最小最大区间中存在那个啥数列的话就是Yes,否则就是No. 为什么在这区间里面就是对的呢?刚开始我也想了好久,然后发现,因为白边权值是1,然后黑边是0,然后假设用到白边最小的是6,最大的是10,那么,我们可以用黑边去替

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

http://acm.hdu.edu.cn/showproblem.php?pid=4786 Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1733    Accepted Submission(s): 543 Problem Description Coach Pang is interested in

HDOJ 4786 Fibonacci Tree

最大生成树夹最小生成树,老题目了,依稀记得当年在成都靠这题捡了个铜..... Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1572    Accepted Submission(s): 479 Problem Description Coach Pang is interested in Fibonac

Fibonacci Tree(最小生成树,最大生成树)

Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3006    Accepted Submission(s): 966 Problem Description Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to

POJ 4786 Fibonacci Tree

Fibonacci Tree Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 478664-bit integer IO format: %I64d      Java class name: Main Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to do som

HDU 4786 Fibonacci Tree 并查集+生成树=kruskal

Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2149    Accepted Submission(s): 682 Problem Description Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him t

HDU--4786 Fibonacci Tree 生成树+贪心?

N个顶点,M条边,每条边可能为黑色或是白色( 0 or 1 ),问有没有可能用为斐波那契数的数目的白色边构成一棵生成树.所以需要删掉图中的环,根据每次删掉的边有一个白色边的上限和下限,判断一下中间有没有斐波那契数就可以了.实现方法是根据颜色排序,先放黑色边得到的是最小数目的白色边构成的生成树,先放白色边得到是最大数目的白色边构成的生成树. #include<cstring> #include<string> #include<fstream> #include<i