标签:des style blog class code java
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
//625MS 1772K
#include<stdio.h>
#include<string.h>
int f[107]= {0,1};
int pre[100007];
int n,m,k;
struct E
{
int u,v,c;
} edg[100007];
void fib()
{
for(k=2;; k++)
{
f[k]=f[k-1]+f[k-2];
if(f[k]>100000)break;
}
}
void init()
{
for(int i=0; i<=n; i++)
pre[i]=i;
}
int find(int x)//路径压缩,否则很容易tle
{
int root=x;
while(root!=pre[root])
{
root=pre[root];
}
while(x!=root)
{
int temp=pre[x];
pre[x]=root;
x=temp;
}
return root;
}
int main()
{
int t,cas=1;
fib();
scanf("%d",&t);
while(t--)
{
int count=0;
scanf("%d%d",&n,&m);
for(int i=0; i<m; i++)
scanf("%d%d%d",&edg[i].u,&edg[i].v,&edg[i].c);
init();
printf("Case #%d: ",cas++);
for(int i=0; i<m; i++)//判断是不是连通图
{
int a=find(edg[i].u);
int b=find(edg[i].v);
if(a!=b)
{
pre[a]=b;
count++;
}
}
if(count!=n-1)
{
printf("No\n");
continue;
}
init();
int maxx=0,minn=0;
for(int i=0; i<m; i++)//求白边的最大数量
if(edg[i].c==1)
{
int a=find(edg[i].u);
int b=find(edg[i].v);
if(a!=b){pre[a]=b,maxx++;}
}
init();
for(int i=0; i<m; i++)//求黑边最大数量
if(edg[i].c==0)
{
int a=find(edg[i].u);
int b=find(edg[i].v);
if(a!=b){pre[a]=b,minn++;}
}
minn=n-1-minn;//求白边最小数量
int flag=0;
for(int i=1; i<k; i++)//在最大最小范围内,判断是否存在斐波那契数
{
if(f[i]>=minn&&f[i]<=maxx)
{
flag=1;
break;
}
}
if(flag)printf("Yes\n");
else printf("No\n");
}
return 0;
}
HDU 4786 Fibonacci Tree,布布扣,bubuko.com
标签:des style blog class code java
原文地址:http://blog.csdn.net/crescent__moon/article/details/25784809