标签: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