链接: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. [poj 2912] Rochambeau 解题报告 (带权并查集)

    题目链接:http://poj.org/problem?id=2912 题目: 题目大意: n个人进行m轮剪刀石头布游戏(0<n<=500,0<=m<=2000) 接下来m行形 ...

  2. Metasploit的攻击实例讲解----ms10_046快捷方式图标漏洞

    不多说,直接上干货! 准备工具 1.Kali linux 2016.2(Rolling)系统  IP:  192.168.1.103 2.受害者机子(windows XP系统)   IP: 10.10 ...

  3. canvas指定的宽高写在行间和写在style里面的区别?

    上代码,指定的canvas宽高都一样,线条的粗细都是5px 1.宽:400:高:300:直接写在<canvas>里的效果: 2.删除<canvas>里的宽高,宽:400:高:3 ...

  4. ora_tool

    #!/bin/ksh # # Copyright (c) 1998, 2002, Oracle Corporation.  All rights reserved. #   version() {   ...

  5. mac终端(terminal)里的快捷键

    Command + K 清屏 Command + T 新建标签 Command +W 关闭当前标签页 Command + S 保存终端输出 Command + D 垂直分隔当前标签页 Command ...

  6. mcustomscrollbar滚动条美化插件

    mCustomScrollbar 是个基于 jQuery UI 的自定义滚动条插件,它可以让你灵活的通过 CSS 定义网页的滚动条,并且垂直和水平两个方向的滚动条都可以定义,它通过 Brandon A ...

  7. MYSQL8.0的安装方法

    1.下载zip安装包: MySQL8.0 For Windows zip包下载地址:https://dev.mysql.com/downloads/file/?id=476233,进入页面后可以不登录 ...

  8. 洛谷1525 关押罪犯NOIP2010 并查集

    问题描述 S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两 ...

  9. 对比学习:《深度学习之Pytorch》《PyTorch深度学习实战》+代码

    PyTorch是一个基于Python的深度学习平台,该平台简单易用上手快,从计算机视觉.自然语言处理再到强化学习,PyTorch的功能强大,支持PyTorch的工具包有用于自然语言处理的Allen N ...

  10. Python学习笔记(1)--Windows基本环境搭建

    1.安装Python 官网下载地址:https://www.python.org/downloads/ 下载完成后安装选择自定义安装,并勾选自动填写环境变量,如果是默认安装,还需要自己手动配置环境变量 ...