mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
74 lines
1.7 KiB
C++
74 lines
1.7 KiB
C++
#include <iostream>
|
|
#include <cstdio>
|
|
#include <cstring>
|
|
#define maxn 100100
|
|
using namespace std;
|
|
|
|
struct edge{
|
|
int u,v;
|
|
}a[2][maxn];
|
|
|
|
int s[2];
|
|
int n,m,c,t,uu,vv,cc,MM,mm,cas=0;
|
|
int f[maxn],g[maxn];
|
|
bool flag;
|
|
|
|
void init() { for (int i=1; i<=n; i++) f[i]=i; }
|
|
|
|
void build(int xx,int yy) { f[f[xx]]=f[yy]; }
|
|
|
|
int getf(int x)
|
|
{
|
|
if (f[x]!=x) f[x]=getf(f[x]);
|
|
return f[x];
|
|
}
|
|
|
|
void addedge(int x)
|
|
{
|
|
int tot=0;
|
|
init();
|
|
for (int i=1; i<=s[x]; i++)
|
|
if (getf(a[x][i].u)!=getf(a[x][i].v)) tot++,build(a[x][i].u,a[x][i].v);
|
|
if (x==0) mm=n-1-tot;
|
|
else MM=tot;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
g[1]=1,g[2]=2;
|
|
for (int i=2; g[i]<=maxn; i++) g[i+1]=g[i]+g[i-1];
|
|
scanf("%d",&t);
|
|
while (t--)
|
|
{
|
|
scanf("%d%d",&n,&m);
|
|
s[0]=s[1]=0;
|
|
for (int i=1; i<=m; i++)
|
|
{
|
|
scanf("%d%d%d",&uu,&vv,&cc);
|
|
a[cc][++s[cc]].u=uu;
|
|
a[cc][s[cc]].v=vv;
|
|
}
|
|
init();
|
|
for (int i=1; i<=s[0]; i++)
|
|
if (getf(a[0][i].u)!=getf(a[0][i].v)) build(a[0][i].u,a[0][i].v);
|
|
for (int i=1; i<=s[1]; i++)
|
|
if (getf(a[1][i].u)!=getf(a[1][i].v)) build(a[1][i].u,a[1][i].v);
|
|
flag=true;
|
|
for (int i=2; i<=n; i++)
|
|
if (getf(i)!=getf(i-1)) { flag=false; break; }
|
|
if (!flag)
|
|
{
|
|
printf("Case #%d: No\n",++cas);
|
|
continue;
|
|
}
|
|
addedge(0),addedge(1);
|
|
//cout<<" MM && mm : " <<mm<<' '<<MM<<endl;
|
|
flag=false;
|
|
for (int i=1; g[i]<=n; i++)
|
|
if (g[i]<=MM && g[i]>=mm) { flag=true; break; }
|
|
if (flag) printf("Case #%d: Yes\n",++cas);
|
|
else printf("Case #%d: No\n",++cas);
|
|
}
|
|
return 0;
|
|
}
|