Fibonacci Tree
Time Limit : 4000/2000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 10 Accepted Submission(s) : 5
Problem Description
Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to do some research on Spanning Tree. So Coach Pang decides to solve the following problem:
Consider a bidirectional graph G with N vertices and M edges. All edges are painted into either white or black. Can we find a Spanning Tree with some positive Fibonacci number of white edges?
(Fibonacci number is defined as 1, 2, 3, 5, 8, ... )
Consider a bidirectional graph G with N vertices and M edges. All edges are painted into either white or black. Can we find a Spanning Tree with some positive Fibonacci number of white edges?
(Fibonacci number is defined as 1, 2, 3, 5, 8, ... )
Input
The first line of the input contains an integer T, the number of test cases. For each test case, the first line contains two integers N(1 <= N <= 10[sup]5[/sup]) and M(0 <= M <= 10[sup]5[/sup]). Then M lines follow, each contains three integers u, v (1 <= u,v <= N, u<> v) and c (0 <= c <= 1), indicating an edge between u and v with a color c (1 for white and 0 for black).
Output
For each test case, output a line “Case #x: s”. x is the case number and s is either “Yes” or “No” (without quotes) representing the answer to the problem.
Sample Input
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
Sample Output
Case #1: Yes Case #2: No
Source
2013 Asia Chengdu Regional Contest
分析:
给你几条边,黑边最后一位为1,白边最后一位为0,问你把黑边全部替换成白边是否能组成斐波那契数。
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
using namespace std;
int f[1000010];
struct node{
int u;
int v;
int w;
};
node pp[200010];
int ff[200010];
bool cmp1(node a,node b)
{
return a.w<b.w;
}
bool cmp2(node a,node b)
{
return a.w>b.w;
}
int find(int x)
{
if(ff[x]==-1)
return x;
return ff[x]=find(ff[x]);
}
int main()
{
int tot=1;
f[0]=1;
f[1]=2;
while(f[tot]<=1000010)
{
f[tot+1]=f[tot-1]+f[tot];
tot++;
}
int t,n,m,cnt=0;
scanf("%d",&t);
while(t--)
{
cnt++;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
scanf("%d%d%d",&pp[i].u,&pp[i].v,&pp[i].w);
sort(pp,pp+m,cmp1);
memset(ff,-1,sizeof(ff));
int ans=0;
for(int i=0;i<m;i++)
{
int f1=find(pp[i].u);
int f2=find(pp[i].v);
if(f1!=f2)
{
ff[f1]=f2;
if(pp[i].w==1)
ans++;
}
}
int low=ans;
memset(ff,-1,sizeof(ff));
sort(pp,pp+m,cmp2);
ans=0;
for(int i=0;i<m;i++)
{
int f1=find(pp[i].u);
int f2=find(pp[i].v);
if(f1!=f2)
{
ff[f1]=f2;
if(pp[i].w==1)
ans++;
}
}
int up=ans;
bool gg=true;
for(int i=1;i<=n;i++)
{
if(find(i)!=find(1))
{
gg=false;
break;
}
}
if(!gg)
{
printf("Case #%d: No\n",cnt);
continue;
}
bool flag=false;
for(int i=0;i<=tot;i++)
{
if(f[i]>=low&&f[i]<=up)
flag=true;
}
if(flag)
printf("Case #%d: Yes\n",cnt);
else
printf("Case #%d: No\n",cnt);
}
//system("pause");
return 0;
}