HDU - 4786 Fibonacci Tree
题目大意:给你个无向图,每条边非黑即白,判断其生成树能否包含斐波那契数条白边
具体思路:把边赋一个权值(白边为1,黑边为0),做一遍最小生成树,做一遍最大生成树
然后我们就可以知道至少要几条白边,至多要几条白边
然后判一下这个区间内有没有斐波那契数就好了
AC代码
#include<bits/stdc++.h> using namespace std; int T,i,j,n,fa[200000],x[200000],y[200000],m,fib[200000]; pair<int,int> a[200000]; int ask(int x){if(fa[x]==x)return x;else return fa[x]=ask(fa[x]);} int main() { scanf("%d",&T); fib[1]=1,fib[2]=2; for (i=3;i<=1000;i++)fib[i]=fib[i-1]+fib[i-2]; int t; for (t=1;t<=T;t++) { printf("Case #%d: ",t); scanf("%d%d",&n,&m); for (i=1;i<=n;i++)fa[i]=i; for (i=1;i<=m;i++) scanf("%d%d%d",&x[i],&y[i],&a[i].first),a[i].second=i; sort(a+1,a+1+m); int tot=0,totw1=0; for (i=1;i<=m;i++) { int fx=ask(x[a[i].second]),fy=ask(y[a[i].second]); if(fx!=fy) { tot++; if(a[i].first)totw1++; fa[fx]=fy; } } if(tot!=n-1) { puts("No"); continue; } for (i=1;i<=n;i++)fa[i]=i; int totw2=0; for (i=m;i>=1;i--) { int fx=ask(x[a[i].second]),fy=ask(y[a[i].second]); if(fx!=fy) { if(a[i].first)totw2++; fa[fx]=fy; } } bool answer=false; for (i=1;i<=1000;i++)if(totw1<=fib[i]&&fib[i]<=totw2) { answer=true; break; } if(answer)puts("Yes");else puts("No"); } return 0; }