题目很新颖的,略带智商,很好。

题目的意思是给你一些白色边和黑色边,现在问你能否用两色边构造出一颗生成树,且树中白色边的数量为一个Fibonacci数。

其实在没做题目之前我就已经听说了这个题目的解题方法了。所以。。。。。

是这样做的,我们首先判断把所有的边都加进去,看看这个图是不是连通的,如果不是,那么显然我们可以直接输出NO了。

接下来是一个很有趣的方法。我们首先把所有两端点在不同集合的白边加入到同一集合,看看最多能加多少条,再按照同样的方法把黑边加入同一集合,看看能加入多少条。

这样一来我们等于是把树中能够包含的白色边的最大数和最小数都求出来了,接下来我们只要看看在这个区间中间有木有一个Fibonacci数就可以了。

也许有人会有疑惑为什么求出最大边数和最小边数中间的每一个边数状态都可以达到呢?

其实可以这样来理解,对于一棵树由于白色边和黑色边两种,我们在任意一个状态,我们可以取出一条黑边然后用一条白边代替这条黑边并且保证这个树是联通的。

因为我们已经把最大的边数和最小的边数都算出来了。

#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 100100
using namespace std; struct edge{
int u,v;
}a[][maxn]; int s[];
int n,m,c,t,uu,vv,cc,MM,mm,cas=;
int f[maxn],g[maxn];
bool flag; void init() { for (int i=; i<=n; i++) f[i]=i; } void build(int xx,int yy) { f[f[xx]]=f[yy]; } int getf(int x)
{
if (f[x]!=x) f[x]=getf(f[x]);
return f[x];
} void addedge(int x)
{
int tot=;
init();
for (int i=; i<=s[x]; i++)
if (getf(a[x][i].u)!=getf(a[x][i].v)) tot++,build(a[x][i].u,a[x][i].v);
if (x==) mm=n--tot;
else MM=tot;
} int main()
{
g[]=,g[]=;
for (int i=; g[i]<=maxn; i++) g[i+]=g[i]+g[i-];
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
s[]=s[]=;
for (int i=; i<=m; i++)
{
scanf("%d%d%d",&uu,&vv,&cc);
a[cc][++s[cc]].u=uu;
a[cc][s[cc]].v=vv;
}
init();
for (int i=; i<=s[]; i++)
if (getf(a[][i].u)!=getf(a[][i].v)) build(a[][i].u,a[][i].v);
for (int i=; i<=s[]; i++)
if (getf(a[][i].u)!=getf(a[][i].v)) build(a[][i].u,a[][i].v);
flag=true;
for (int i=; i<=n; i++)
if (getf(i)!=getf(i-)) { flag=false; break; }
if (!flag)
{
printf("Case #%d: No\n",++cas);
continue;
}
addedge(),addedge();
//cout<<" MM && mm : " <<mm<<' '<<MM<<endl;
flag=false;
for (int i=; g[i]<=n; i++)
if (g[i]<=MM && g[i]>=mm) { flag=true; break; }
if (flag) printf("Case #%d: Yes\n",++cas);
else printf("Case #%d: No\n",++cas);
}
return ;
}

HDU4786_Fibonacci Tree的更多相关文章

  1. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  2. SAP CRM 树视图(TREE VIEW)

    树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...

  3. 无限分级和tree结构数据增删改【提供Demo下载】

    无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...

  4. 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  5. Leetcode 笔记 110 - Balanced Binary Tree

    题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...

  6. Leetcode 笔记 100 - Same Tree

    题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...

  7. Leetcode 笔记 99 - Recover Binary Search Tree

    题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...

  8. Leetcode 笔记 98 - Validate Binary Search Tree

    题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...

  9. Leetcode 笔记 101 - Symmetric Tree

    题目链接:Symmetric Tree | LeetCode OJ Given a binary tree, check whether it is a mirror of itself (ie, s ...

随机推荐

  1. 20155317 王新玮 2006-2007-2 《Java程序设计》第4周学习总结

    20155317 王新玮 2006-2007-2 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 继承共同行为 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那 ...

  2. GridView中加入//实现分页

    要在GridView中加入//实现分页 AllowPaging="true" PageSize="10" // 分页时触发的事件 protectedvoid g ...

  3. [SDOI2010]地精部落 DP

    LG传送门 DP好题 题意很简单,就是求1-n的排列,满足一个数两边的数要么都比它大要么都比它小,求这样的排列个数对\(p\)取膜的值(为了表述简单,我们称这样的排列为波动序列). 这个题我第一眼看到 ...

  4. iOS 关于权限设置的问题

      在info.plist文件下添加 <key>NSContactsUsageDescription</key>    <string>请求访问通讯录</st ...

  5. Quartz学习--三 Hello Jdbc Quartz! 和 demo 结尾

    四. Hello JDBC Quartz! JDBC方式: 就是说通过数据库的jdbc链接来进行quartz的一个配置 Quartz支持了很好的支持 demo用例 使用mysql作为例子进行演示 相比 ...

  6. JAVA学习笔记--字符串概述

    一.String类 String类代表字符串,是由字符构成的一个序列.创建String对象的方法很简单,有以下几种: 1)用new来创建: String s1 = new String("m ...

  7. tikv 安装

    export HostIP="127.0.0.1" docker run -d -p 2379:2379 -p 2380:2380 --name pd pingcap/pd \ - ...

  8. Golang项目开发管理

    工具 1. task(项目管理,类似于make) go get -u -v github.com/go-task/task/cmd/task 2. gopm(go依赖管理) go get -u git ...

  9. eos TODO EOS区块链上EOSJS和scatter开发dApp

    由于我一直在深入研究EOS dApp的开发,我看了不少好文章.在这里,我汇总了下做一些研究后得到的所有知识.在本文中,我将解释如何使用EOSJS和scatter.我假设你对智能合约以及如何在EOS区块 ...

  10. Scrum立会报告+燃尽图(十月二十一日总第十二次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246 项目地址:https://git.coding.net/zhang ...