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<stdlib.h> struct s { int u,v,w; }edge[100100]; int pre[100100],a[100100],n,m; int cmp1(const void *a,const void *b) { return (*(struct s *)a).w-(*(struct s *)b).w; } int cmp2(const void *a,const void *b) { return (*(struct s *)b).w-(*(struct s *)a).w; } void init(int n) { int i; for(i=0;i<=n;i++) pre[i]=i; } void fun() { int i; a[1]=1;a[2]=2; for(i=3;i<100100;i++) a[i]=a[i-1]+a[i-2]; } int find(int x) { if(x==pre[x]) return pre[x]; return pre[x]=find(pre[x]); } int ku() { init(n); int ans=0,i,j; for(i=0;i<m;i++) { int u,v,w; u=edge[i].u; v=edge[i].v; w=edge[i].w; int fa=find(u); int fb=find(v); if(fa!=fb) { pre[fa]=fb; ans+=w; } } int num=0; for(i=1;i<=n;i++) if(pre[i]==i) num++; if(num>1) return -1; return ans; } int main() { int t,c=0; scanf("%d",&t); fun(); while(t--) { //int n,m int i,l,r; scanf("%d%d",&n,&m); //init(n); for(i=0;i<m;i++) { scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w); } qsort(edge,m,sizeof(edge[0]),cmp1); l=ku(); qsort(edge,m,sizeof(edge[0]),cmp2); r=ku(); if(l==-1||r==-1) { printf("Case #%d: No\n",++c); } else { int flag=0; for(i=1;i<100100;i++) { if(a[i]>r) break; if(a[i]<=r&&a[i]>=l) { printf("Case #%d: Yes\n",++c); flag=1; break; } } if(!flag) printf("Case #%d: No\n",++c); } } }
HDOJ 题目4786 Fibonacci Tree(克鲁斯卡尔)
原文:http://blog.csdn.net/yu_ch_sh/article/details/44566893