点击打开题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4786
#include<stdio.h>
#include<string.h>
struct Tree
{
int a,b,c;
}tree[110000];
int node[110000];
int fib[40];
int n,m;
void Fibonacci()
{
int i;
fib[0]=fib[1]=1;
for(i=2;i<=40;i++)
{
fib[i]=fib[i-1]+fib[i-2];
if(fib[i]>100000)
break;
}
}
int find(int a)
{
if(a==node[a])
return a;
else
return node[a]=find(node[a]);
}
int klske(int a)
{
int i,j,k;
int sum;
for(i=1;i<=n;i++)
node[i]=i;
sum=0;
for(i=0;i<m;i++)
{
if(tree[i].c!=a)
{
j=find(tree[i].a);
k=find(tree[i].b);
if(j!=k)
{
node[j]=k;
sum++;
}
}
}
return sum;
}
int main()
{
int t;
int i,j;
int ok;
int min,max;
int num=1;
Fibonacci();
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
scanf("%d%d%d",&tree[i].a,&tree[i].b,&tree[i].c);
if(klske(2)!=n-1) //如果不能连通,即执行合并次数不等于n-1,除去一个根节点
printf("Case #%d: No\n",num);
else //如果可以生成,则判断白边个数是否等于为指定数列中的数
{
min=n-1-klske(1); //加入白边的最小值
max=klske(0);//加入白边的最大值
ok=0;
//求在此区间内有没有指定数列中的数就行了
for(i=0;fib[i]<=100000;i++)
if(min<=fib[i]&&max>=fib[i])
{
ok=1;
break;
}
if(ok==1)
printf("Case #%d: Yes\n",num);
else
printf("Case #%d: No\n",num);
}
num++;
}
return 0;
}