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<algorithm>
using namespace std;
int f[100100];
int tt[25];
int find(int x){return x==f[x]?x:f[x] = find(f[x]);} //初始化为自己
void Union(int x, int y){
int fx = find(x), fy = find(y);
if(fx == fy)return ;
if(fx>fy) swap(fx,fy);
f[fx] = f[x] = f[y] = fy;//这样 就可以直接查f[i] 判断祖先了
}
struct path
{
int v,u,c;
};
path lu[200100];
int cmp(path a,path b)// 白先
{
return a.c>b.c;
}
int cmp2(path a,path b)
{
return a.c<b.c;
}
int main()
{
int i,t;
int big,sml;
tt[1]=1,tt[2]=2;
for(i=3;;i++)
{
tt[i]=tt[i-2]+tt[i-1];
if(tt[i]>100000)
break;
}
int cas=1;
int u,v,n,m,flag;
int x,y;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&lu[i].u,&lu[i].v,&lu[i].c);
}
flag=1;
// 求大的
for(i=1;i<=n;i++)
f[i]=i;
sort(lu,lu+m,cmp);
big=0;
for(i=0;i<m;i++)
{
x=lu[i].v;
y=lu[i].u;
if(find(x)!=find(y))
{
Union(x,y);
big+=lu[i].c;
}
}
for(i=1;i<=n;i++)//
{
if(find(i)!=find(1))
flag=0;
}
sml=0;
for(i=1;i<=n;i++)
f[i]=i;
sort(lu,lu+m,cmp2);
for(i=0;i<m;i++)
{
x=lu[i].v;
y=lu[i].u;
if(find(x)!=find(y))
{
Union(x,y);
sml+=lu[i].c;
}
}
for(i=1;i<=n;i++)//
{
if(find(i)!=find(1))
flag=0;
}
printf("Case #%d: ",cas++);
if(flag==0)
{
printf("No\n");
continue;
}
// printf("%d\n",tt[25]);
flag=0;
for(i=1;i<=24;i++)
{
if(tt[i]<=big&&tt[i]>=sml)
flag=1;
}
if(flag)
puts("Yes");
else
puts("No");
}
return 0;
}HDU 4786 Fibonacci Tree 并查集+生成树=kruskal
原文地址:http://blog.csdn.net/u013532224/article/details/40952701