Fibonacci Tree

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 2340    Accepted Submission(s): 748

Problem Description
  Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to do some research on Spanning Tree. So Coach Pang decides to solve the following problem:

  Consider a bidirectional graph G with N vertices and M edges. All edges are painted into either white or black. Can we find a Spanning Tree with some positive Fibonacci number of white edges?

(Fibonacci number is defined as 1, 2, 3, 5, 8, ... )
 
Input
  The first line of the input contains an integer T, the number of test cases.

  For each test case, the first line contains two integers N(1 <= N <= 105) and M(0 <= M <= 105).

  Then M lines follow, each contains three integers u, v (1 <= u,v <= N, u<> v) and c (0 <= c <= 1), indicating an edge between u and v with a color c (1 for white and 0 for black).
 
Output
  For each test case, output a line “Case #x: s”. x is the case number and s is either “Yes” or “No” (without quotes) representing the answer to the problem.
 
Sample Input
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
 
Sample Output
Case #1: Yes
Case #2: No
 
Source





题意:问构成的生成树当中是否存在黑色边(边为1)数为斐波那契数
思路:求出生成树中最小包括的黑色边数。和最多黑色边数,假设有斐波那契数在两者之间,则能够构成。由于黑白边能够搭配使用
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n,m;
int fibo[50];
int f[100010];
struct node
{
int u,v,c;
} s[100010]; bool cmp1(node x , node y)
{
return x.c < y.c;
} bool cmp2(node x, node y)
{
return x.c > y.c;
} int find(int x)
{
return x == f[x] ? x : f[x] = find(f[x]);
} void Union(int x ,int y)
{
int fx = find(x);
int fy = find(y); if(fx != fy)
{
f[fx] = fy;
}
} int main()
{
#ifdef xxz
freopen("in.txt","r",stdin);
#endif
fibo[1] = 1;
fibo[2] = 2;
for(int i = 3; ; i++)
{
fibo[i] = fibo[i-1] + fibo[i-2];
if(fibo[i] >= 100000) break;
} int T,Case = 1;;
scanf("%d",&T); while(T--)
{ scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++) f[i] = i; for(int i = 0; i < m; i++)
{ scanf("%d%d%d",&s[i].u,&s[i].v,&s[i].c);
Union(s[i].u,s[i].v);
}
int cent = 0;
int bl = 0, bh = 0;
int root = 0,size = 0; for(int i = 1; i <= n; i++)
{
if(f[i] == i)
{
cent++;
root = i;
}
} printf("Case #%d: ",Case++);
if(cent >= 2) cout<<"No"<<endl;//首先要推断能否构成一个生成树。推断根节点个数是否为1即可
else
{
sort(s,s+m,cmp1);
for(int i = 1; i <= n; i++) f[i] = i; for(int i = 0; i < m; i++)
{
int fu = find(s[i].u);
int fv = find(s[i].v);
if(fu == fv) continue; bl += s[i].c;
size++;
Union(s[i].u,s[i].v);
if(size == n-1) break;
} size = 0;
sort(s,s+m,cmp2);
for(int i = 1; i <= n; i++) f[i] = i; for(int i = 0; i < m; i++)
{
int fu = find(s[i].u);
int fv = find(s[i].v);
if(fu == fv) continue; bh += s[i].c;
size++;
Union(s[i].u,s[i].v);
if(size == n-1) break;
} int flag = 0;
for(int i =1; fibo[i] <= 100000 ; i++ )
{
if(fibo[i] >= bl && fibo[i] <= bh)
{
flag = 1;
break;
}
}
if(flag) printf("Yes\n");
else printf("No\n"); } }
}

Hdu4786的更多相关文章

  1. 【最小生成树】【kruscal】hdu4786 Fibonacci Tree

    假设这张图能够形成具有k条白边的生成树, 则易证k一定形成一个连续的区间[a,b],中间一定不会断开.要是断开……tm怎么可能. 所以求出a,b就好啦,人家都给你把白边赋成1了,直接跑一下最小生成树, ...

  2. hdu4786 Fibonacci Tree (最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4786 题意:给定图的n个点和m条双向边,告诉你每条边的权值.权值为1表示该边是白边,权值为0表示该边为 ...

  3. hdu4786 Fibonacci Tree[最小生成树]【结论题】

    一道结论题:如果最小生成树和最大生成树之间存在fib数,成立.不存在或者不连通则不成立.由于是01图,所以这个区间内的任何生成树都存在. 证明:数学归纳?如果一棵树没有办法再用非树边0边替代1边了,那 ...

  4. 最小生成树练习2(Kruskal)

    两个BUG鸣翠柳,一行代码上西天... hdu4786 Fibonacci Tree(生成树)问能否用白边和黑边构成一棵生成树,并且白边数量是斐波那契数. 题解:分别优先加入白边和黑边,求出生成树能包 ...

  5. Fibonacci Tree

    hdu4786:http://acm.hdu.edu.cn/showproblem.php?pid=4786 题意:给你一个无向图,然后其中有的边是白色的有的边是黑色的.然后问你是否存在一棵生成树,在 ...

  6. The 2013 ACMICPC Asia Regional Chengdu

    还有19天出发北京站,今年北京站的出题方是上交,去年他们出的成都现场的赛题,首先复盘一下. 去年的成都是我经历的第一次现场赛,也是近距离第一次见到了CLJ的真人,最后也是被虐惨了,那时候是声闻大神带着 ...

随机推荐

  1. Shiro:初识Shiro及简单尝试

    Shiro 一.什么是Shiro Apache Shiro是Java的一个安全(权限)框架 作用:认证.授权.加密.会话管理.与web集成.缓存等 下载地址:http://shiro.apache.o ...

  2. 2015 Multi-University Training Contest 3 hdu 5324 Boring Class

    Boring Class Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  3. 工具-WIN7-内存占用过高解决办法

    我的WIN7内存竟然吃到了7.6G,太不可思意了 第一步 看看网上的解决办法 http://jingyan.baidu.com/article/870c6fc31060eab03fe4beee.htm ...

  4. ASP.NET-技巧01

    ==符号的写法 ViewBag.StatusMessage = message == ManageMessageId.ChangePasswordSuccess ? "你的密码已更改.&qu ...

  5. CF16A Flag

    CF16A Flag 题意翻译 题目描述 根据一项新的ISO标准,每一个国家的国旗应该是一个n×m的格子场,其中每个格子最多有10种不同的颜色.并且国旗应该有条纹:旗帜的每一行应包含相同颜色的方块,相 ...

  6. hadoop系列:zookeeper(2)——zookeeper核心原理(选举)

    1.前述 上篇文章<hadoop系列:zookeeper(1)--zookeeper单点和集群安装>(http://blog.csdn.net/yinwenjie/article/deta ...

  7. linux下开发,解决cocos2d-x中编译出现的一个小问题, undefined reference to symbol &#39;pthread_create@@GLIBC_2.2.5&#39;

    解决cocos2d-x中编译出现的一个小问题 对于cocos2d-x 2.×中编译中,若头文件里引入了#include "cocos-ext.h",在进行C++编译的时候会遇到例如 ...

  8. 用了一天的时间,linux下expect实现ssh自己主动登录server记,歧视下网上各种抄来抄去残段子

    由于要对客户方的快30个项目进行特别有顺序的重新启动,所以不得不想办法写个脚本,网上看了不少段子.真是残缺的能够. 没有一段是能够正常运行的.我来按顺序记录一下 脚本的本身 使用expect实现自己主 ...

  9. 软工视频总结Part Three

    软件需求分析 任务 解决目标系统"做什么"问题 深入描写叙述软件的功能和性能 确定软件涉及到的约束和软件接口 定义软件的其它有效需求 特点 一致性.完整性.限时性.有效性.可验证性 ...

  10. 好莱坞原则—Spring的IOC容器

    IOC容器的概念,之前在学习SSH的时候,就有接触过.但那时候也仅仅是知道这么个概念,认为它非常难理解.事实上并非它难理解,而是我并没有停下来好好对它总结梳理过. IOC(Inversion of C ...