链接: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. 查看suse系统版本

    cat /etc/*-release OR lsb_release -d

  2. 8.解决IntelliJ Idea 集成TortoiseSVN 时找不到svn.exe

    转自:https://blog.csdn.net/beibeijia125/article/details/70183533?utm_source=blogxgwz9 首先我们可以在http://su ...

  3. [NOIP2015模拟10.27] 挑竹签 解题报告(拓扑排序)

    Description 挑竹签——小时候的游戏夏夜,早苗和诹访子在月光下玩起了挑竹签这一经典的游戏.挑竹签,就是在桌上摆上一把竹签,每次从最上层挑走一根竹签.如果动了其他的竹签,就要换对手来挑.在所有 ...

  4. POJ 3013 Dijkstra

    从1节点最短路,,然后再乘一下权值就OK了 //By SiriusRen #include <queue> #include <cstdio> #include <cst ...

  5. Kali linux 2016.2(Rolling)中metasploit的端口扫描

    目前常见的端口扫描技术一般有如下几类: TCP  Connect.TCP SYN.TCP ACK.TCP FIN. Metasploit中的端口扫描器 Metasploit的辅助模块中提供了几款实用的 ...

  6. Mac上vmware虚拟机Windows10安装JDK8及配置环境

    1.jdk8下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.双击下载的jdk进行安装 3.安装成功之 ...

  7. TP5 belongsTo 和 hasOne的区别

    hasOne和belongsTo这两种方法都可以应用在一对一关联上,但是他们也是有区别的: belongsTo: 从属关系:就是谁为主的问题 A:{id,name,sex} B:{id,name.A_ ...

  8. easyui_datagrid使用

    easyui的datagrid显示数据的方式(使用了jQuery) 第一步 创建显示的格式,方法有两种: 第一种:在HTML标签中创建,类似如下的形式,参数可以在标签中设置,也可以在脚本中 这种方式在 ...

  9. Spring Cloud学习笔记【六】Hystrix 监控数据聚合 Turbine

    上一篇我们介绍了使用 Hystrix Dashboard 来展示 Hystrix 用于熔断的各项度量指标.通过 Hystrix Dashboard,我们可以方便的查看服务实例的综合情况,比如:服务调用 ...

  10. struts2登录后返回登录前的页面

    在Action中添加 String getUrl() { return ServletActionContext.getRequest().getHeader("referer") ...