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
Case #1: Yes Case #2: No
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct s
{
	int u,v,w;
}edge[100100];
int pre[100100],a[100100],n,m;
int cmp1(const void *a,const void *b)
{
	return (*(struct s *)a).w-(*(struct s *)b).w;
}
int cmp2(const void *a,const void *b)
{
	return (*(struct s *)b).w-(*(struct s *)a).w;
}
void init(int n)
{
	int i;
	for(i=0;i<=n;i++)
		pre[i]=i;
}
void fun()
{
	int i;
	a[1]=1;a[2]=2;
	for(i=3;i<100100;i++)
		a[i]=a[i-1]+a[i-2];
}
int find(int x)
{
	if(x==pre[x])
		return pre[x];
	return pre[x]=find(pre[x]);
}
int ku()
{
	init(n);
	int ans=0,i,j;
	for(i=0;i<m;i++)
	{
		int u,v,w;
		u=edge[i].u;
		v=edge[i].v;
		w=edge[i].w;
		int fa=find(u);
		int fb=find(v);
		if(fa!=fb)
		{
			pre[fa]=fb;
			ans+=w;
		}
	}
	int num=0;
	for(i=1;i<=n;i++)
		if(pre[i]==i)
			num++;
		if(num>1)
			return -1;
		return ans;
}
int main()
{
	int t,c=0;
	scanf("%d",&t);
	fun();
	while(t--)
	{
		//int n,m
		int i,l,r;
		scanf("%d%d",&n,&m);
		//init(n);
		for(i=0;i<m;i++)
		{
			scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
		}
		qsort(edge,m,sizeof(edge[0]),cmp1);
		l=ku();
		qsort(edge,m,sizeof(edge[0]),cmp2);
		r=ku();
		if(l==-1||r==-1)
		{
			printf("Case #%d: No\n",++c);
		}
		else
		{
			int flag=0;
			for(i=1;i<100100;i++)
			{
				if(a[i]>r)
					break;
				if(a[i]<=r&&a[i]>=l)
				{
					printf("Case #%d: Yes\n",++c);
					flag=1;
					break;
				}
			}
			if(!flag)
				printf("Case #%d: No\n",++c);
		}
	}
}HDOJ 题目4786 Fibonacci Tree(克鲁斯卡尔)
原文:http://blog.csdn.net/yu_ch_sh/article/details/44566893