链接: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. c# 之 New新知

    本人从事.NET工作已经一段时间,毕业之前一直想着做C++的,后来因为各种原因(跟学校导师相关),走向了.NET之路,从而时不时补一下.net的基础知识,因为自己的.NET知识还不是很扎实.近期每天早 ...

  2. __attribute__ 详解

    GNU C的一大特色(却不被初学者所知)就是__attribute__机制.__attribute__可以设置函数属性(Function    Attribute).变量属性(Variable Att ...

  3. AFNetworking的原理与基本使用-b

    全称是AFNetworking 虽然运行效率没有ASI高,但是使用比ASI简单 是对NSURLConnection和NSURLSession的各自的一层包装 AFN的内部中的RunLoop AFN内部 ...

  4. lua方法点(.)调用和冒号(:)调用区别:

    用.定义方法时object.func_name(arg1,arg2...),方法真正的函数签名形式为: object.func_name(arg1, arg2...) 用:定义方法时object:fu ...

  5. nginx提示No input file specified怎么办

    用了网上提供的各种方法都不行,即便html能正常打开,php文件依然有问题.而后继续尝试了修改权限 chown -vR www:www /folder 功能都正常. nginx.conf 的 user ...

  6. String, StringBuffer, StringBuilder比较

    1.见API: String是不可变的字符序列: StringBuffer是线程安全的,可变的字符序列: StringBuilder是可变的字符序列: StringBuffer与String的区别是S ...

  7. 【pm2】

    告别node-forever,拥抱PM2 pm2及forever模块是目前较常用的nodejs进程守护模块,前者更常用些.功能也更强大(提供负载).其原理主要是pm2开启一个主进程,另行再开子进程运行 ...

  8. sql server 2005+ 翻页

    select * from ( select row_number() over (order by dm) row,* from t_zycp where dm like '%4%' ) tmp

  9. Android开发学习笔记:浅谈WebView

    本文转自:http://www.2cto.com/kf/201108/101518.html WebView(网络视图)能加载显示网页,可以将其视为一个浏览器.它使用了WebKit渲染引擎加载显示网页 ...

  10. <转>如何将Chrome变成开发利器,开发者们在用这些插件

    Chrome 浏览器具有强大的跨平台能力以及丰富的扩展插件,一直是许多开发者的首要选择.而利用许多 Chrome 插件,开发者们在开发流程中能够极大地提高开发效率.我们就整理了十款开发者常用的 Chr ...