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. 从YV12到NV12

    Media SDK的decoder,vpp,encoder对输入输出格式有着严格的限制,现在仅仅支持NV12.那么如何从其他格式转化为NV12是日常工作中经常遇到的事情.本篇文章以此为目的,讨论如何将 ...

  2. js内置对象——Math

    Math()是JavaScript的内置对象(对于内置对象的理解,会单独写文章说明),包含了很多数学相关的方法: 常用方法: 1 Math.ceil(x) //取最近的最大整数返回 2 Math.fl ...

  3. codeforces7D Palindrome Degree(manacher&amp;dp或Hsh&amp;dp)

    D. Palindrome Degree time limit per test 1 second memory limit per test 256 megabytes input standard ...

  4. LeetCode——Pascal&#39;s Triangle II

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3 ...

  5. iOS开发- 生成/解析.vcf文件

    vcf, 通讯录导出的一种格式. 一.生成vcf文件 假设要把我们iPhone通讯录里的数据, 生成vcf格式文件. 我们能够借助iCloud. 小技巧:通过iCloud导出iPhone通讯录的方法 ...

  6. [jzoj NOIP2018模拟10.29]

    OI生涯的最高分,来了纪中这么多天,在经历了这么多场“NOIP难度”的模拟赛之后,终于看到了真正的NOIP 今天考场上效率很高,很快码完了全部的题目,留下了足够的时间对拍和...发呆.不得不说看着电脑 ...

  7. Ubuntu16.04下Mongodb官网卸载部署步骤(图文详解)(博主推荐)

    不多说,直接上干货! 前期博客 Ubuntu16.04下Mongodb官网安装部署步骤(图文详解)(博主推荐) https://docs.mongodb.com/manual/tutorial/ins ...

  8. echarts中国地图

    echarts中国地图效果图: =================== 需要引入echarts的js文件:(1.echarts.min.js:2.china.js) 下载地址: echarts.min ...

  9. Java文件(io)编程——简易记事本开发

    public class NotePad extends JFrame implements ActionListener{ //定义需要的组件 JTextArea jta=null; //多行文本框 ...

  10. ZOJ 2883 Shopaholic【贪心】

    解题思路:给出n件物品,每买三件,折扣为这三件里面最便宜的那一件即将n件物品的价值按降序排序,依次选择a[3],a[6],a[9]----a[3*k] Shopaholic Time Limit: 2 ...