HDU 4786 Fibonacci Tree(2013亚洲区成都站现场赛)

来源:互联网 发布:好日子 韩国网络剧 编辑:程序博客网 时间:2024/05/15 07:38

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4786

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<algorithm>#include<queue>#include<stack>#include<vector>#include<map>#include<set>#include<list>#define mem(x,y)memset(x,y,sizeof(x))#define max(a,b)(a)>(b)?(a):(b)#define min(a,b)(a)<(b)?(a):(b)#define eps 1e-10#define M 100000007#define INF 0x1f1f1f1fusing namespace std;typedef long long int LL;typedef __int64 ll;const int maxn=100005;int a[maxn];int f[maxn];int vis[200000];int n,m;struct node{    int u,v;    int c;};node q[maxn];int cmp1(node x1,node y1){    return x1.c<y1.c;}int cmp2(node x1,node y1){    return x1.c>y1.c;}void init(){    int i;    for(i=0;i<=n;i++)    {        f[i]=i;    }}int Find(int x){    if(x!=f[x])    {        f[x]=Find(f[x]);    }    return f[x];}int kru1(){    init();    int ans=0,s=0;    int sum=0;    int i,j;    for(i=0;i<m;i++)    {        int xx=Find(q[i].u);        int yy=Find(q[i].v);        if(xx==yy)        {            continue;        }        ans=q[i].c;        sum++;        s+=ans;        f[yy]=xx;        if(sum==n-1)break;    }    //printf()    if(sum<n-1)return -1;    else return s;}int kru2(){    init();    int ans=0,s=0,sum=0;    int i,j;    for(i=m-1;i>=0;i--)    {        int xx=Find(q[i].u);        int yy=Find(q[i].v);        if(xx==yy)        {            continue;        }        ans=q[i].c;        sum++;        s+=ans;        f[yy]=xx;        if(sum==n-1)break;    }    if(sum<n-1)return -1;    else return s;}int main(){    int T,i,j;    int num=1;    mem(vis,0);    a[0]=1;    a[1]=2;    vis[1]=1;    vis[2]=1;    for(i=2;i<=25;i++)    {        a[i]=a[i-1]+a[i-2];        vis[a[i]]=1;    }    scanf("%d",&T);    while(T--)    {        int x,y,z;        scanf("%d %d",&n,&m);        for(i=0;i<m;i++)        {            scanf("%d %d %d",&q[i].u,&q[i].v,&q[i].c);        }        sort(q,q+m,cmp1);        int minprime=kru1();        int maxprime=kru2();        int flag=0;        for(i=minprime;i<=maxprime;i++)        {            if(vis[i])            {                flag=1;                break;            }        }        printf("Case #%d: ",num++);        if(flag)        {            printf("Yes\n");        }        else        {            printf("No\n");        }    }    return 0;}
0 0
原创粉丝点击