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, ... )
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\n",++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\n",++cas);
else
printf("Case #%d: No\n",++cas);
}
return 0;
}

浙公网安备 33010602011771号