![]()
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct edge
{
int x;
int y;
int len;
}edges[100005];
bool up1(edge a,edge b) // jiegouti anzhao w++++
{
return a.len<b.len;
}
bool down1(edge a,edge b) // jiegouti anzhao w---
{
return a.len>b.len;
}
int parent[100005];
int ffind(int x)
{
if(x==parent[x]) return x;
else return parent[x]=ffind(parent[x]);
}
int kruskal()
{
for(int i=1;i<=n;i++)
{
parent[i]=i;
}
int ans=0;
int num=0;
for(int i=1;i<=m;i++)
{
int a1=ffind(edges[i].x);
int a2=ffind(edges[i].y);
if(a1!=a2)
{
ans=ans+edges[i].len;
parent[a1]=a2;
num++;
}
}
if(num==n-1) return ans;
else return 0;
}
int main()
{
long long fei[34];
fei[0]=1; fei[1]=1;
for(int i=2;i<=33;i++)
fei[i]=fei[i-1]+fei[i-2];
int T;cin>>T;
for(int o=1;o<=T;o++)
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>edges[i].x>>edges[i].y>>edges[i].len;
}
printf("Case #%d: ",o);
sort(edges+1,edges+m+1,up1);
int min1=kruskal();
sort(edges+1,edges+m+1,down1);
int max1=kruskal();
//cout<<endl;
//cout<<min1<<" "<<max1<<endl;
if(min1==0&&max1==0)
{
cout<<"No"<<endl;
}
else
{
int t=0;
for(int i=0;i<31;i++)
{
if(fei[i]<=max1&&fei[i]>=min1)
{
t=1;
break;
}
}
if(t==0)
{
cout<<"No"<<endl;
}
if(t==1)
{
cout<<"Yes"<<endl;
}
}
}
return 0;
}
最小生成树&&最大生成树