链接:http://acm.hdu.edu.cn/showproblem.php?pid=4786

题意:给出n个点,m条边,和边的信息。

边有两种颜色,白色和黑色。现要求构造一个生成树。看是否能满足白边的数量是斐波那契数。

这道题比赛的时候,小白想到了一种方法:按边颜色排序后,先用白边优先建树,求出最大白边最大个数maxm,再用黑边优先建树,求出白边最小个数minm。看这两个范围内是否存在斐波那契数。

听上去感觉还挺有道理,可是不知道怎么证明正确性,后来想想,生成树构造完之后。再加入随意一条边都会产生回路。而产生回路之后就有边会被替换,而minm是最少的白边数,也就是minm个白边是不会被换掉的。maxm同理,所以中间的回路替换掉边总能保证用白边替换黑边,或者黑边替换白边。所以能够这么做。

我信心满满的開始敲。然后WA了。。

由于我写完cmp函数后忘记写sort了,并且还过了例子。改过之后交一发。还是WA。后来发现数组开了110。。。并且提示是WA不是RE

另外,这道题假设不进行路径压缩,会超时

#include<cstring>
#include<string>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#include<functional>
#include<cmath>
using namespace std;
#define PI acos(-1.0)
#define MAXN 110000
#define eps 1e-7
#define INF 0x7FFFFFFF
#define seed 131
#define ll long long
#define ull unsigned ll
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 struct node{
int u,v,col;
}edge[MAXN];
int father[MAXN],fi[90];
int n,m,flag;
bool cmp(node x,node y){
return x.col>y.col;
}
int find(int x){
int t = x;
while(father[t]!=t){
t = father[t];
}
int k = x;
while(k!=t){
int temp = father[k];
father[k] = t;
k = temp;
}
return t;
}
void solve(){
int i,j=0;
int flag2 = 0;
int minm,maxm;
minm = maxm = 0;
sort(edge,edge+m,cmp);
for(i=0;i<m;i++){
int a = find(edge[i].u);
int b = find(edge[i].v);
if(a!=b){
if(edge[i].col==1) maxm++;
father[a] = b;
j++;
if(j>=n-1){
flag2 = 1;
break;
}
}
}
if(flag2==0){
return ;
}
for(i=1;i<=n;i++){
father[i] = i;
}
j = 0;
for(i=m-1;i>=0;i--){
int a = find(edge[i].u);
int b = find(edge[i].v);
if(a!=b){
if(edge[i].col==1) minm++;
father[a] = b;
j++;
if(j>=n-1) break;
}
}
//cout<<minm<<" "<<maxm<<endl;
for(i=1;i<45;i++){
if(fi[i]>=minm&&fi[i]<=maxm)
{
flag = 1;
break;
}
}
}
int main(){
int i,j,k=1,t;
int a,b,c;
fi[1] = 1;
fi[2] = 2;
for(i=3;i<45;i++){
fi[i] = fi[i-1] + fi[i-2];
//cout<<fi[i]<<" "<<i<<" "<<endl;
}
scanf("%d",&t);
while(t--){
flag = 0;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) father[i] = i;
for(i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
edge[i].u = a;
edge[i].v = b;
edge[i].col = c;
}
solve();
if(flag) printf("Case #%d: Yes\n",k++);
else printf("Case #%d: No\n",k++);
}
return 0;
}

HDOJ--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. hdoj 4786 Fibonacci Tree【并查集+最小生成树(kruskal算法)】

    Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  3. HDU 4786 Fibonacci Tree 生成树

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4786 题意:有N个节点(1 <= N <= 10^5),M条边(0 <= M <= ...

  4. hdu 4786 Fibonacci Tree (2013ACMICPC 成都站 F)

    http://acm.hdu.edu.cn/showproblem.php?pid=4786 Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others) ...

  5. HDU 4786 Fibonacci Tree 最小生成树

    Fibonacci Tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4786 Description Coach Pang is intere ...

  6. HDU 4786 Fibonacci Tree

    Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) P ...

  7. POJ 4786 Fibonacci Tree

    Fibonacci Tree Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ...

  8. HDU 4786 Fibonacci Tree (2013成都1006题)

    Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  9. hdu 4786 Fibonacci Tree(最小生成树)

    Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  10. hdu 4786 Fibonacci Tree (最小、最大生成树)

    题意: N个点,M条边.每条边连接两个点u,v,且有一个权值c,c非零即一. 问能否将N个点形成一个生成树,并且这棵树的边权值和是一个fibonacii数. (fibonacii数=1,2,3,5,8 ...

随机推荐

  1. sqlsever2008数据库的备份与还原

    本文数据库的名称为ProjectControl  public static SqlConnection conn = new SqlConnection("server=(local);u ...

  2. usb host和usb device

    S3C2440的数据手册将USB功能分为两章--usb host和usb device.具体什么意思呢? usb host: 微处理器作为usb主设备,可以挂接U盘之类的从属设备. usb devic ...

  3. UM分享 - 详解

    官网: http://dev.umeng.com 友盟现在发展的很壮大! 有熟为人知的社会化分享\统计分析\消息推送\即时通信\自动更新\多媒体服务等功能, 今天就其中第一项 分享功能, 做出分解. ...

  4. Nexus 7 跳过网络验证

     本文从著名安卓论坛 xda-developers 搬运而来,原文链接 http://forum.xda-developers.com/showthread.php?t=1909602 由于众所周知的 ...

  5. 第 9 章 模板方法模式【Template Method Pattern】

    以下内容出自:<<24种设计模式介绍与6大设计原则>> 周三,9:00,我刚刚坐到位置,打开电脑准备开始干活. “小三,小三,叫一下其它同事,到会议室,开会”老大跑过来吼,带着 ...

  6. Qt, QT/E, Qtopia 的区别

    转自Qt, QT/E, Qtopia 的区别 Qt泛指Qt的所有桌面版本,比如Qt/X11,Qt Windows,Qt Mac等.由于Qt最早是在Linux中随着KDE流行开来的,因此通常很多人说的Q ...

  7. SQL Server GOTO使用实例详解

    GOTO命令用来改变程序执行的流程,使程序跳到标识符指定的程序行再继续往下执行.语法:GOTO  标识符标识符需要在其名称后加上一个冒号“:”.例如:“33:”,“loving:.SQL语句如下:DE ...

  8. POJ 1778 All Discs Considered(拓扑排序)

    点我看题目 题意 :其实题意我也说不清楚,因为比赛的时候我盯着看了1个小时也没看懂....就是两个磁盘,第一个有n1的安装包,编号为1~n1,第二个有n2个安装包,编号为n1~n2.给你d对关系,(x ...

  9. FFmpeg发送流媒体的命令(UDP,RTP,RTMP)

    http://blog.csdn.net/leixiaohua1020/article/details/38283297

  10. QQ协议的TEA加解密算法

    QQ通讯协议里的加解密算法. #include <stdio.h> #include <stdlib.h> #include <memory.h> #include ...