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
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int f[100100]; int tt[25]; int find(int x){return x==f[x]?x:f[x] = find(f[x]);} //初始化为自己 void Union(int x, int y){ int fx = find(x), fy = find(y); if(fx == fy)return ; if(fx>fy) swap(fx,fy); f[fx] = f[x] = f[y] = fy;//这样 就可以直接查f[i] 判断祖先了 } struct path { int v,u,c; }; path lu[200100]; int cmp(path a,path b)// 白先 { return a.c>b.c; } int cmp2(path a,path b) { return a.c<b.c; } int main() { int i,t; int big,sml; tt[1]=1,tt[2]=2; for(i=3;;i++) { tt[i]=tt[i-2]+tt[i-1]; if(tt[i]>100000) break; } int cas=1; int u,v,n,m,flag; int x,y; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=0;i<m;i++) { scanf("%d%d%d",&lu[i].u,&lu[i].v,&lu[i].c); } flag=1; // 求大的 for(i=1;i<=n;i++) f[i]=i; sort(lu,lu+m,cmp); big=0; for(i=0;i<m;i++) { x=lu[i].v; y=lu[i].u; if(find(x)!=find(y)) { Union(x,y); big+=lu[i].c; } } for(i=1;i<=n;i++)// { if(find(i)!=find(1)) flag=0; } sml=0; for(i=1;i<=n;i++) f[i]=i; sort(lu,lu+m,cmp2); for(i=0;i<m;i++) { x=lu[i].v; y=lu[i].u; if(find(x)!=find(y)) { Union(x,y); sml+=lu[i].c; } } for(i=1;i<=n;i++)// { if(find(i)!=find(1)) flag=0; } printf("Case #%d: ",cas++); if(flag==0) { printf("No\n"); continue; } // printf("%d\n",tt[25]); flag=0; for(i=1;i<=24;i++) { if(tt[i]<=big&&tt[i]>=sml) flag=1; } if(flag) puts("Yes"); else puts("No"); } return 0; }
HDU 4786 Fibonacci Tree 并查集+生成树=kruskal
原文地址:http://blog.csdn.net/u013532224/article/details/40952701