zoukankan      html  css  js  c++  java
  • Fibonacci Tree

    Fibonacci Tree

    Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
    Total Submission(s) : 13   Accepted Submission(s) : 6
    Problem Description
      Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to do some research on Spanning Tree. So Coach Pang decides to solve the following problem:
      Consider a bidirectional graph G with N vertices and M edges. All edges are painted into either white or black. Can we find a Spanning Tree with some positive Fibonacci number of white edges?
    (Fibonacci number is defined as 1, 2, 3, 5, 8, ... )
     

    Input
      The first line of the input contains an integer T, the number of test cases.   For each test case, the first line contains two integers N(1 <= N <= 10[sup]5[/sup]) and M(0 <= M <= 10[sup]5[/sup]).   Then M lines follow, each contains three integers u, v (1 <= u,v <= N, u<> v) and c (0 <= c <= 1), indicating an edge between u and v with a color c (1 for white and 0 for black).
     

    Output
      For each test case, output a line “Case #x: s”. x is the case number and s is either “Yes” or “No” (without quotes) representing the answer to the problem.
     

    Sample Input
    2 4 4 1 2 1 2 3 1 3 4 1 1 4 0 5 6 1 2 1 1 3 1 1 4 1 1 5 1 3 5 1 4 2 1
     

    Sample Output
    Case #1: Yes Case #2: No
     

    Source


    最小生成树和最大生成树中白边的数量之间是否夹了一个菲波数,先打表列出能用到的菲波数,然后最大生成树与最小生成树的建立。代码:


    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define MAXN 1000010
    using namespace std;
    int sum,ans;
    int pri[MAXN];
    int fibonacci[26]={0,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025};//打表
    struct s
    {
    	int a;
    	int b;
    	int cost;
    }dis[MAXN];
    bool cmp(s A,s B)
    {
    	return A.cost<B.cost;
    }
    int find(int x)
    {
    	int r=x;
    	while(r!=pri[r])
    	r=pri[r];
    	int i=x,j;
    	while(i!=r)
    	{
    		j=pri[i];
    		pri[i]=r;
    		i=j;
    	}
    	return r;
    }
    void connect(int xx,int yy,int num)
    {
    	int nx=find(xx);
    	int ny=find(yy);
    	if(nx!=ny)
    	{
    		pri[nx]=ny;
    		ans++;
    		if(num==1)
    		sum++;
    	}
    }
    int main()
    {
    	int i,j,m,s,n;
    	int t,q,num,k,low,high;
    	int cas=0;
    	
    	scanf("%d",&t);
    	while(t--)
    	{
    		sum=0;
    		scanf("%d%d",&n,&m);
    		for(i=1;i<=n;i++)
    		pri[i]=i;
    		for(i=0;i<m;i++)
    		{
    			scanf("%d%d%d",&dis[i].a,&dis[i].b,&dis[i].cost);
    		}
    		sort(dis,dis+m,cmp);
    		
    		ans=0;
    		for(i=0;i<m;i++)
    		{
    			connect(dis[i].a,dis[i].b,dis[i].cost);
    		}
    		if(ans!=n-1)   
            {  
                printf("Case #%d: No
    ",++cas);  
                continue;  
            }
    		low=sum;
    		
    		sum=0;
    		for(i=1;i<=n;i++)
    		pri[i]=i;
    		for(i=m-1;i>=0;i--)
    		{
    			connect(dis[i].a,dis[i].b,dis[i].cost);
    		}
    		high=sum;
    		
    		int bz=0;
    		for(i=1;i<=24;i++)
    		{
    			if(fibonacci[i]>=low&&fibonacci[i]<=high)
    			bz=1;
    		}
    		
    		if(bz)
    		printf("Case #%d: Yes
    ",++cas);
    		else
    		printf("Case #%d: No
    ",++cas);
    	}
    	return 0;
    }


  • 相关阅读:
    shell 命名管道,进程间通信
    bash shell:重定向标准错误输出
    paramiko socket.error: Int or String expected
    django csrf_token生成
    shell基础知识
    复制vi全部内容到windows ctrl+shift+c
    linux配置bridge (不同网段)
    sdk shell下脚本.soc
    X86服务器BMC基板管理控制器介绍
    linux 开启vnc
  • 原文地址:https://www.cnblogs.com/playboy307/p/5273831.html
Copyright © 2011-2022 走看看