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