链接: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. Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD

    Build.VERSION.SDK_INT是系统的版本,Build.VERSION_CODES.GINGERBREAD是版本号. 到VERSION.SDK_INT不禁诧异,这是何物?! 看API的定义 ...

  2. MinGW安装和使用基础教程

    MinGW全称Minimalist GNU For Windows,是个精简的Windows平台C/C++.ADA及Fortran编译器,相比Cygwin而言,体积要小很多,使用较为方便.MinGW提 ...

  3. 什么是MySQL?(一)

    课程大纲 第一章:初识MySQL 1.1什么是MySQL?  1.2如何安装MySQL?  1.3如何配置MySQL?  1.4如何启动和关闭MySQL?  1.5MySQL的登录和退出  1.6如何 ...

  4. iOS菜鸟成长笔记(3)——斯坦福公开课学习(1)

    一.iOS四层结构 1.Core OS 是用FreeBSD和Mach所改写的Darwin, 是开源.符合POSIX标准的一个Unix核心.这一层包含或者说是提供了整个iPhone OS的一些基础功能, ...

  5. OpenGL编程逐步深入(十)索引绘制

    准备知识 OpenGl提供了一些绘图函数.到目前为止我们使用的glDrawArrays绘图函数属于"顺序绘制".这意味着顶点缓冲区从指定的偏移量开始被扫描,每X(点为1,直线为2等 ...

  6. 利用js与java交互

    为了方便网页和应用的交互,安卓系统WebView提供JavaScript网页脚本调用Java类方法的机制.只要调用addJavascriptInterface方法即可映射一个Java对象到JavaSc ...

  7. codeforces 527 C Glass Carving

    Glass Carving time limit per test 2 seconds Leonid wants to become a glass carver (the person who cr ...

  8. python 爬虫简介

    初识Python爬虫 互联网 简单来说互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML.JS.CSS代码返回给浏览器,这些代码经过浏览器解析.渲染,将丰富多彩的网页呈现 ...

  9. Unity C# 设计模式(七)适配器模式

    定义: 将一个类的接口转换成客户希望的另一个接口.adapter模式使得原本由于接口不兼容而不能在一起的那些类可以一起工作. 示例代码: 1.类适配器 /* Class Adapter:类适配器,这里 ...

  10. 三:redis的List类型相关操作

    </pre><pre name="code" class="php" style="font-size: 14px;"&g ...