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

题意:有N个节点(1 <= N <= 10^5),M条边(0 <= M <= 10^5)。当中一部分边被染成了黑色,剩下的边是白色,问能不能建立一棵树,树中有斐波那契数个白色边。

思路:用克鲁斯卡尔建三次树,第一是用全部边建树。推断能否建成一棵树,第二次用黑边建树,最多能够用到x条黑边(不成环),n-1-x就是最少须要用的白边的数量,第三次用白边建树,最多能够用到y条白边。假设在【y,n-1-x】中有斐波那契数,则能够满足题意来建立这棵树。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <cstdlib>
#include <queue>
#include <stack>
#include <vector>
#include <ctype.h>
#include <algorithm>
#include <string>
#include <set>
#define PI acos(-1.0)
#define maxn 10005
#define INF 0x7fffffff
#define eps 1e-8
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
int root[100005];
int findset(int x)
{
return x==root[x]?x:root[x]=findset(root[x]);
}
int Fib[40];
void init()
{
Fib[0]=1;
Fib[1]=1;
for(int i=2; i<=29; i++)
Fib[i]=Fib[i-1]+Fib[i-2];
}
struct edge
{
int x,y;
int color;
} e[100005];
int Kruskal_w(edge e[],int m,int n,int f)
{
int sum=0;
for(int i=0; i<m; i++)
if(sum>=n-1)
break;
else if(e[i].color==f)
{
int xx=findset(e[i].x);
int yy=findset(e[i].y);
if(xx==yy)
continue;
else
{
if(xx<yy)
root[yy]=xx;
else root[xx]=yy;
sum++;
}
}
return sum;
}
int Kruskal_a(edge e[],int m,int n,int &sum1)
{
int sum=0;
for(int i=0; i<m; i++)
{
if(sum1>=n-1)
break;
else if(e[i].color==1)
{
int xx=findset(e[i].x);
int yy=findset(e[i].y);
if(xx==yy)
continue;
else
{ if(xx<yy)
root[yy]=xx;
else root[xx]=yy;
sum++;
sum1++;
}
}
else
{
int xx=findset(e[i].x);
int yy=findset(e[i].y);
if(xx==yy)
continue;
else
{
sum1++;
if(xx<yy)
root[yy]=xx;
else root[xx]=yy;
}
}
}
return sum;
}
int main()
{
int T;
scanf("%d",&T);
init();
for(int ii=1;ii<=T;ii++)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0; i<m; i++)
{
scanf("%d%d",&e[i].x,&e[i].y);
scanf("%d",&e[i].color);
}
for(int i=0;i<=n;i++)
root[i]=i;
int sum1=Kruskal_w(e,m,n,1);
int sum2=0;
for(int i=0;i<=n;i++)
root[i]=i;
int sum3=Kruskal_a(e,m,n,sum2);
for(int i=0;i<=n;i++)
root[i]=i;
int sum4=Kruskal_w(e,m,n,0);
printf("Case #%d: ",ii);
bool flag=0;
if(sum2==n-1)
{
for(int i=0; i<=29; i++)
{
if(Fib[i]>=n-1-sum4&&Fib[i]<=sum1)
{
flag=1;
break;
}
}
if(flag)
printf("Yes\n");
else printf("No\n");
}
else printf("No\n");
}
return 0;
}

HDU 4786 Fibonacci Tree 生成树的更多相关文章

  1. HDU 4786 Fibonacci Tree(生成树,YY乱搞)

    http://acm.hdu.edu.cn/showproblem.php? pid=4786 Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others ...

  2. hdu 4786 Fibonacci Tree (2013ACMICPC 成都站 F)

    http://acm.hdu.edu.cn/showproblem.php?pid=4786 Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others) ...

  3. HDU 4786 Fibonacci Tree 最小生成树

    Fibonacci Tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4786 Description Coach Pang is intere ...

  4. HDU 4786 Fibonacci Tree

    Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) P ...

  5. HDU 4786 Fibonacci Tree (2013成都1006题)

    Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  6. hdu 4786 Fibonacci Tree(最小生成树)

    Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  7. hdu 4786 Fibonacci Tree (最小、最大生成树)

    题意: N个点,M条边.每条边连接两个点u,v,且有一个权值c,c非零即一. 问能否将N个点形成一个生成树,并且这棵树的边权值和是一个fibonacii数. (fibonacii数=1,2,3,5,8 ...

  8. 【HDU 4786 Fibonacci Tree】最小生成树

    一个由n个顶点m条边(可能有重边)构成的无向图(可能不连通),每条边的权值不是0就是1. 给出n.m和每条边的权值,问是否存在生成树,其边权值和为fibonacci数集合{1,2,3,5,8...}中 ...

  9. hdu 4786 Fibonacci Tree 乱搞 智商题目 最小生成树

    首先计算图的联通情况,如果图本身不联通一定不会出现生成树,输出"NO",之后清空,加白边,看最多能加多少条,清空,加黑边,看能加多少条,即可得白边的最大值与最小值,之后判断Fibo ...

随机推荐

  1. js html 事件冒泡

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  2. Import Example Dataset

    Overview The examples in this guide use the restaurants collection in the test database. The followi ...

  3. django 笔记17 ModelForm

    Model 数据库操作 验证 验证 Form -class LoginForm(Form): email = fields.EmailField() is_valid 每一个字段进行正则(字段内置正则 ...

  4. Map, filter and reduce

    To add up all the numbers in a list, you can use a loop like this: Total is initialized to 0. Each t ...

  5. Kali linux 2016.2(Rolling)里Metasploit连接(包括默认和自定义)的PostgreSQL数据库之后的切换到指定的工作空间

    不多说,直接上干货! 为什么要这么做? 答: 方便我们将扫描不同的目标或目标的不同段,进行归类.为了更好的后续工作! 前期博客 Kali linux 2016.2(Rolling)里Metasploi ...

  6. SQL--CLR概述

    Visual Studio 2005  支持在 SQL Server 2005 中开发.部署和调试托管代码.有一种新的项目类型(称为 SQL Server 项目),它允许开发人员在 SQL Serve ...

  7. gcd(最大公约数)lcm(最小公倍数)E - Wolf and Rabbit

    1.gcd 递归实现 int gcd(int i,int j){ if(j==0) return i; else return gcd(j,i%j);} 2.lcm int gcd(int i,int ...

  8. caffe(5) 其他常用层及参数

    本文讲解一些其它的常用层,包括:softmax_loss层,Inner Product层,accuracy层,reshape层和dropout层及其它们的参数配置. 1.softmax-loss so ...

  9. 入门python:《Python编程从入门到实践》中文PDF+英文PDF+代码学习

    入门python推荐学习久负盛名的python入门书籍<Python编程从入门到实践>. 书中涵盖的内容是比较精简的,没有艰深晦涩的概念,最重要的是每个小结都附带有"动手试一试& ...

  10. xml里面product的值在哪里设置的?

    转载请注明出处:http://blog.csdn.net/droyon/article/details/39890469 在进行Android应用程序开发时,善于运用xml中的product配置,能够 ...